Autor |
Beitrag |
DiamondDog
      
Beiträge: 460
|
Verfasst: 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:
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, 0, 0, iWidth, iHeight, GetWindowDC(h), 0, 0, 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, 0, 0, 0, 0, SWP_NOACTIVATE + SWP_NOMOVE + SWP_NOSIZE); Bmp.Width := self.Width; Bmp.Height := self.Height; Canvas.Draw(0, 0, 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; 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-1) do begin rowOut := help.ScanLine[y]; P := Bitmap.scanline[bitmap.height-1]; inc(p,y); for x := 0 to (b-1) do 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
|
Verfasst: Di 28.10.08 10:51
Zitat: | Delphi-Quelltext 1: 2: 3: 4:
| Canvas.Draw(0, 0, Bmp); BitmapDrehen_90Grad(Bmp); finally Bmp.Free; | |
Du zeichnest erst, drehst dann und gibst daraufhin frei. Die Reihenfolge kann ja so nicht stimmen.
|
|
DiamondDog 
      
Beiträge: 460
|
Verfasst: 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
|
Verfasst: Di 28.10.08 11:04
Einfaches Strecken geht mit StretchBlt, für proportionales Strecken musst Du erst ein bisschen rechnen.
|
|
DiamondDog 
      
Beiträge: 460
|
Verfasst: Di 28.10.08 11:28
Ok habs jetzt so gemacht:
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(0, 0, 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
|
Verfasst: Di 28.10.08 11:33
Versuch es mal so:
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); |
|
|
DiamondDog 
      
Beiträge: 460
|
Verfasst: Di 28.10.08 11:54
Dann wird das Bild nicht angezeigt.
|
|
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: 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 
      
Beiträge: 460
|
Verfasst: Di 28.10.08 12:15
DeddyH hat folgendes geschrieben : | 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
|
Verfasst: Di 28.10.08 12:21
Verstehe ich jetzt nicht auf Anhieb. Eigentlich sollte doch auf die gesamte Breite gestretched werden.
|
|
DiamondDog 
      
Beiträge: 460
|
Verfasst: 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
|
Verfasst: Di 28.10.08 13:03
Ich habe meinen Code von oben gerade einmal ausprobiert... stretched wie gedacht.
|
|
DiamondDog 
      
Beiträge: 460
|
Verfasst: Di 28.10.08 13:22
Ich habs hinbekommen, hab einfach alles noch mal neu gemacht und jetzt läuft es.
1000 Dank.
|
|
|