Autor Beitrag
DiamondDog
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 460



BeitragVerfasst: Di 28.10.08 10:23 
Hallo Leute,
wie der Titel schon sagt hab ich ein Problem,
mit dem drehen eines TBitmap um 90°.
So sieht mein Code aus:
ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
function FormularScreenShot(Bmp: TBitmap; h : hWnd): Boolean;
var
  Rec: TRect;
  iWidth, iHeight: Integer;
begin
  with Bmp do try
    GetWindowRect(h, Rec);

    iWidth  := Rec.Right - Rec.Left;
    iHeight := Rec.Bottom - Rec.Top;

    Width := iWidth;
    Height := iHeight;

    BitBlt(Canvas.Handle, 00, iWidth, iHeight, GetWindowDC(h), 00, SRCCOPY);

    Result := True;
  finally
    ReleaseDC(h, GetWindowDC(h));
  end;
end;

{*************************************************************}
procedure TForm1.ScreenShot;
var Bmp: TBitmap;
begin
  Bmp := TBitmap.Create;
  try
    self.WindowState:=wsMinimized;
    FormularScreenShot(Bmp, GetDesktopWindow);
    self.WindowState     := wsMaximized;
    SetWindowPos(Handle, HWND_TOPMOST, 0000, SWP_NOACTIVATE + SWP_NOMOVE + SWP_NOSIZE);
    Bmp.Width            := self.Width;         
    Bmp.Height           := self.Height;
    Canvas.Draw(00, Bmp);
    BitmapDrehen_90Grad(Bmp);
  finally
    Bmp.Free;
  end;
end;

{*************************************************************}
procedure TForm1.Button1Click(Sender: TObject);
begin
 self.ScreenShot;
end;

{*************************************************************}
procedure TForm1.BitmapDrehen_90Grad(const Bitmap: TBitmap);
var P: PRGBQuad; //^THelpRGB;
    x,y,b,h : Integer;
    RowOut: ^TMyHelp;
    help: TBitmap;
begin
  Bitmap.PixelFormat := pf32bit;
  help := TBitmap.Create;
  try
    help.PixelFormat := pf32bit;
    b := bitmap.Height;
    h := bitmap.Width;
    help.Width := b;
    help.height := h;
    for y := 0 to (h-1do
    begin
      rowOut := help.ScanLine[y];
      P  := Bitmap.scanline[bitmap.height-1];
      inc(p,y);
      for x := 0 to (b-1do
      begin
        rowout[x] := p^;
        inc(p,h);
      end;
    end;
  finally
    bitmap.Assign(help);
  end;
end;
Der Screenshot wird gemacht, aber das Bild leider nicht um 90° gedreht.
Kann mir jemand sagen wo drann das liegt?

Danke schon mal.

Mfg Dog
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Di 28.10.08 10:51 
Zitat:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
    Canvas.Draw(00, Bmp);
    BitmapDrehen_90Grad(Bmp);
  finally
    Bmp.Free;

Du zeichnest erst, drehst dann und gibst daraufhin frei. Die Reihenfolge kann ja so nicht stimmen.
DiamondDog Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 460



BeitragVerfasst: Di 28.10.08 11:02 
Ahhh ok Fehler gefunden.
Aber eine Frage habe ich dann noch und zwar:
Wenn das Bild gedreht wurde wie kann ich es so strecken,
das es bei jedem dreh den ganzen Bildschirm ausfüllt?
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Di 28.10.08 11:04 
Einfaches Strecken geht mit StretchBlt, für proportionales Strecken musst Du erst ein bisschen rechnen.
DiamondDog Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 460



BeitragVerfasst: Di 28.10.08 11:28 
Ok habs jetzt so gemacht:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
    BitmapDrehen_90Grad(Bmp);
    SetStretchBltMode(bmp.Canvas.Handle, Halftone);
    StretchBlt(bmp.Canvas.Handle, 0,0,self.Width,self.Height,bmp.Canvas.Handle,0,0,bmp.Width,bmp.Height,SRCCOPY);
    Canvas.Draw(00, Bmp);
das Bild wird hier bei zwar gestreckt,
aber es wird nicht auf der ganzen Form angezeigt.
Wie muß ich das ändern das es die Ganze Form ausfüllt?
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Di 28.10.08 11:33 
Versuch es mal so:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
    BitmapDrehen_90Grad(Bmp);
    SetStretchBltMode(Canvas.Handle, Halftone);
    StretchBlt(Canvas.Handle, 0,0,self.Width,self.Height,bmp.Canvas.Handle,0,0,bmp.Width,bmp.Height,SRCCOPY);
    //Canvas.Draw(0, 0, Bmp);
DiamondDog Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 460



BeitragVerfasst: Di 28.10.08 11:54 
Dann wird das Bild nicht angezeigt.
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Di 28.10.08 12:01 
Bei mir schon. Aber wie ich bereits neulich bemerkte, solltest Du die Bitmap im OnPaint auf das Formular zeichnen.
DiamondDog Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 460



BeitragVerfasst: Di 28.10.08 12:15 
user profile iconDeddyH hat folgendes geschrieben Zum zitierten Posting springen:
Bei mir schon. Aber wie ich bereits neulich bemerkte, solltest Du die Bitmap im OnPaint auf das Formular zeichnen.


Ja ok ich komm damit aber besser klarr, ist nit bös gemeint würds nur gerne so lassen.

Hab mal angehängt wie das bei mir aussieht.
Einloggen, um Attachments anzusehen!
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Di 28.10.08 12:21 
Verstehe ich jetzt nicht auf Anhieb. Eigentlich sollte doch auf die gesamte Breite gestretched werden.
DiamondDog Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 460



BeitragVerfasst: Di 28.10.08 12:40 
Hab auch schon mit self.Width+self.Width versucht,
aber immer das selbe es bleibt immer in der selben größe.
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Di 28.10.08 13:03 
Ich habe meinen Code von oben gerade einmal ausprobiert... stretched wie gedacht.
DiamondDog Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 460



BeitragVerfasst: Di 28.10.08 13:22 
Ich habs hinbekommen, hab einfach alles noch mal neu gemacht und jetzt läuft es.

1000 Dank.