TBitmap drehen, code funktioniert nicht .. [ gelöst ]

Für Probleme bezüglich Grafik, Audio, GL, ACS, ...
Antworten
Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1630
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

TBitmap drehen, code funktioniert nicht .. [ gelöst ]

Beitrag von corpsman »

Guten Morgen alle miteinander,

Ich versuche gerade eines meiner Delphi projeckte unter Lazarus zum laufen zu bekommen, doch so ganz will es noch nicht.

Ich möchte einfach nur eine Procedure haben, die ein "Übergebenes" Bild um 90 grad dreht. Unter Delphi ja kein Problem.

Das man in Lazarus FPC mit IntfImages arbeiten mus weis ich und habe mir daher dieses monstrum hier überlegt. doch irgendwie gehts nicht. Das Bild wird nach der Rotation eindach schwarz. Könnt ihr mir meinen Fehler zeigen ?

Code: Alles auswählen

Procedure Drehen90Grad(Const Bitmap: TBitmap);
Var
  tmp: Tbitmap;
  TempIntfImg2, TempIntfImg: TLazIntfImage;
  ImgHandle, ImgMaskHandle: HBitmap;
  i, j: integer;
Begin
  bitmap.pixelformat := pf24bit;
  tmp := TBitmap.create;
  tmp.pixelformat := pf24bit;
  tmp.width := Bitmap.Height;
  tmp.height := Bitmap.Width;
  TempIntfImg := TLazIntfImage.Create(0, 0);
  TempIntfImg.LoadFromBitmap(tmp.Handle, tmp.MaskHandle);
  TempIntfImg2 := TLazIntfImage.Create(0, 0);
  TempIntfImg2.LoadFromBitmap(Bitmap.Handle, Bitmap.MaskHandle);
  For i := 0 To bitmap.width - 1 Do
    For j := 0 To bitmap.height - 1 Do Begin
      TempIntfImg.Colors[j, i] := TempIntfImg2.Colors[i, j];
    End;
  TempIntfImg.CreateBitmaps(ImgHandle, ImgMaskHandle, false);
  tmp.Handle := ImgHandle;
  tmp.MaskHandle := ImgMaskHandle;
  TempIntfImg.free;
  bitmap.assign(tmp);
  tmp.free;
  TempIntfImg2.free;
End;
Zuletzt geändert von corpsman am Mo 16. Nov 2009, 07:12, insgesamt 1-mal geändert.
--
Just try it

Benutzeravatar
theo
Beiträge: 10927
Registriert: Mo 11. Sep 2006, 19:01

Re: TBitmap drehen, code funktioniert nicht ..

Beitrag von theo »

bitmap.pixelformat := pf24bit;
tmp.pixelformat := pf24bit;

braucht's nicht, du arbeitest ja nicht auf der Scanline.

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1630
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: TBitmap drehen, code funktioniert nicht ..

Beitrag von corpsman »

ich weis zwar nicht warum, aber wenn ich die Pixelformat dinger weg lass gehts tatsächlich ;)

gibts da dann noch ne "schnellere" dreh routine ?
--
Just try it

Benutzeravatar
theo
Beiträge: 10927
Registriert: Mo 11. Sep 2006, 19:01

Re: TBitmap drehen, code funktioniert nicht ..

Beitrag von theo »

corpsman hat geschrieben: gibts da dann noch ne "schnellere" dreh routine ?
Naja, hängt vom Szenario ab. Mit der LCL-Grafik im Endeffekt kaum.
Mit OpBitmap wäre es möglich. Ich weiss aber nicht, ob du das willst, deshalb spar ich mir erstmal Beispiele.

marcov
Beiträge: 1102
Registriert: Di 5. Aug 2008, 09:37
OS, Lazarus, FPC: Windows ,Linux,FreeBSD,Dos (L trunk FPC trunk)
CPU-Target: 32/64,PPC(+64), ARM
Wohnort: Eindhoven (Niederlande)

Re: TBitmap drehen, code funktioniert nicht ..

Beitrag von marcov »

corpsman hat geschrieben:ich weis zwar nicht warum, aber wenn ich die Pixelformat dinger weg lass gehts tatsächlich ;)

gibts da dann noch ne "schnellere" dreh routine ?
Ja, (fuer 90,180,270 grad). Aber das ist schwieriger. Unter steht meine 8-bit (256 farben) version:

http://stackoverflow.com/questions/8480 ... ps-in-code" onclick="window.open(this.href);return false;

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1630
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: TBitmap drehen, code funktioniert nicht .. [ gelöst ]

Beitrag von corpsman »

Danke für die Infos,

Es ging mir eigentlich um folgendes :

Meine bisherige Anwendung lief unter Windows mit Delphi5 Pro

Die Anwendung macht nichts anderes als :
Anzeigen eines JPG mittels Stretch draw auf der Form
3 Buttons für Drehen 90 , 180, 270
1 Button für Save
1 Edit für die Compressionsstufe

Dann lädt man mittels Opendialog eine Riesen Liste von Bildern und kann diese nacheinander drehen und/oder einfach nur "komprimieren" Fertig.

Da ich sehr häufig viele Bilderlisten habe lohnt sich dieses kleine Tool.

Die Windows Variante ist nun allerdings deutlich schneller als die Lazarus Linux Version.
Sprich die Win variante ( Delphi Tbitmap, Scanline ) dreht schneller als die hier gezeigte Variante.
Auch habe ich den Eindruck das allein schon das anzeigen mittels :

Code: Alles auswählen

canvas.StretchDraw(rect(336, 16, 336 + 266, 16 + 200), bm)
spürbar langsamer ist. Dabei habe ich das nun nicht extra mittels gettickcount gemessen, dieser Eindruck entsteht bereits schon so.
--
Just try it

Benutzeravatar
theo
Beiträge: 10927
Registriert: Mo 11. Sep 2006, 19:01

Re: TBitmap drehen, code funktioniert nicht .. [ gelöst ]

Beitrag von theo »

Ja, StretchDraw ist nicht sonderlich schnell. Deshalb sagte ich ja auch, es kommt auf's Szenario an. Wahrsch. verliertst du da mehr Zeit als beim drehen.

Aber mal eine andere Frage: Wieso musst du die Dinger überhaupt auf den Screen bringen, beim Batch konvertieren?

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1630
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: TBitmap drehen, code funktioniert nicht .. [ gelöst ]

Beitrag von corpsman »

Na weil ich nicht weis welche Bilder ich wie rum drehen will.

Ich mache sehr viele Aufnahmen mit der Kamera, und die müssen halt immer mal links mal rechts rum gedreht werden. Und dein Verdacht bestätigt sich mir immer mehr. Das Stretchdraw scheint in der Tag sehr Langsam zu sein, es gibt da auch keine schnellere Variante, oder ?, denn unter Win dauerts ja auch nicht so lange ..
--
Just try it

Benutzeravatar
theo
Beiträge: 10927
Registriert: Mo 11. Sep 2006, 19:01

Re: TBitmap drehen, code funktioniert nicht .. [ gelöst ]

Beitrag von theo »

Mach doch mal ein paar Messungen für

-Laden der Bilder
-Drehen
-Stretchdrawen

Mit GetTickCount reicht. Dann weisst du, wo du ansetzen musst.
Das Laden dauert bestimmt auch seine Zeit.

Antworten