| Autor |
Beitrag |
Killian2004
      
Beiträge: 72
Vista Business x64
Delphi 7 Ent. RAD Studio 2009
|
Verfasst: Do 20.09.07 21:45
Hi Leute,
ich habe heute eine kleine Funktion zur Bildinvertierung hier im Forum gefunden.
Der Code funktioniert bestens, aber leider nur, falls das TImage ein Bitmap als Bildobjekt besitzt. Lade ich ein *.png oder *.jpg, dann wird nach Ausführen der Invert-Funktion das Bild des TImage gelöscht und man sieht gar nichts mehr.
Invert-Funktion:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| Function TFilters.InvertBMP(_object_: TBitmap): TBitmap; Var x, y: Integer; ByteArray: PByteArray; Begin _object_.PixelFormat := pf24bit; For y := 0 To _object_.Height - 1 Do Begin ByteArray := _object_.ScanLine[y]; For x := 0 To _object_.Width * 3 - 1 Do Begin ByteArray[x] := Not ByteArray[x]; End; End; Result := _object_; End; |
Funktionsaufruf:
Delphi-Quelltext 1: 2: 3: 4: 5:
| procedure TbMAINFORM.buttonInvertClick(Sender: TObject); begin Image1.Picture.Bitmap := bFILTER_CTRL.InvertBMP(Image1.Picture.Bitmap); Image1.Refresh; end; |
Hat jemand eine Idee warum es nur mit Bitmaps funktioniert? Und eventuell einen Tipp wie ich es mit den anderen Bildformaten doch realisieren kann?
mfG, Killian
_________________ Die Antwort ist 17, aber wie lautet die Frage?
|
|
kkausp
      
Beiträge: 77
Erhaltene Danke: 1
W2K, WIN XP, WIN XPe; WIN7
(D1;D2;D5;) D6 Ent.; D2009 Ent.
|
Verfasst: Fr 21.09.07 08:09
Vorher in Bitmap umwandeln.
|
|
Killian2004 
      
Beiträge: 72
Vista Business x64
Delphi 7 Ent. RAD Studio 2009
|
Verfasst: Fr 21.09.07 19:35
Hm, ich dachte wenn ich die Funktion aufrufe, dann wäre der übergebene Bildinhalt automatisch in ein Bitmap konvergiert!?!?
Wie ließe sich denn z.B. der Inhalt eines 32Bit PNGs in ein Bitmap umwandeln? Bzw. ein Jpg in ein Bitmap?
mfG, Killian
_________________ Die Antwort ist 17, aber wie lautet die Frage?
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Fr 21.09.07 22:01
Probier's mal so:
Delphi-Quelltext
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
Killian2004 
      
Beiträge: 72
Vista Business x64
Delphi 7 Ent. RAD Studio 2009
|
Verfasst: Mo 24.09.07 08:59
Hi, also
Delphi-Quelltext
liefert keine Veränderung. Weiterhin ist das TImage leer nach dem Funktionsaufruf.
Ich versuchte per CopyRect, aber auch das bringt nichts, da meldet der Compiler, dass das Canvas leer ist.
Jmd noch ne Idee???
mfG, Killian
_________________ Die Antwort ist 17, aber wie lautet die Frage?
|
|
Lossy eX
      
Beiträge: 1048
Erhaltene Danke: 4
|
Verfasst: Mo 24.09.07 11:05
Also ich weiß zwar nicht woher die Methode stammt aber der Rückgabewert macht nur wirklich bedingt Sinn, denn die Daten des Bitmaps werden direkt verändert. Damit brauchst du eigentlich den Rückgabewert niemals zuweisen. Zu mal du den Rückgabewert ja auch oben rein gesteckt hast.
Aber versuch mal deine Bilder wie folgt zu laden. Dadurch wird das Bild zu erst in einem temporären TPicture geladen und anschließend auf ein Bitmap zugewiesen.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| var Pic: TPicture; begin Pic := TPicture.Create; try Pic.LoadFromFile('MeineLustigeBildatei.jpg'); Image1.Picture.Bitmap.Assign(Pic.Graphic); InvertBMP(Image1.Picture.Bitmap); finally Pic.Free; end; end; |
Sobald dein PNG allerdings auch eine Transparenz enthält geht es so aber nicht! Denn dadurch wird sie zerstört. Und ein TBitmap kann sowieso nichts mit einer Tranzparenz anfangen.
_________________ Nur die Menschheit ist arrogant genug, um zu glauben sie sei die einzige intelligente Lebensform im All. Wo nicht mal das nachhaltig bewiesen wurde.
|
|
Killian2004 
      
Beiträge: 72
Vista Business x64
Delphi 7 Ent. RAD Studio 2009
|
Verfasst: So 30.09.07 16:14
Hi Lossy,
also ich habe deinen Code probiert. Das klappt auch mit Jpegs, ABER nur unmittelbar nachdem ich ein Bild per Dialog lade.
Habe ich den Pfad als String in einem TreeView und lade das betreffende Bild bei Selektion des TreeItems, dann bekomme ich mit dem gleichen Code einen ConvertError:
Exception der Klasse EConvertError. Meldund: 'TOleGraphic kann nicht zu TBitmap zugewiesen werden'. Prozess wurde angehalten...blablabla
Ich verstehe nicht ganz warum das beim direkt Laden funktioniert, bei der zweiten Variante aber nicht. Tausche ich '...Assign(Pic.Graphic)' gegen '...Assign(Pic.Bitmap)', dann kommt zwar keine Exception mehr, aber dafür zeigt er das Jpeg nicht mal mehr an. Von Invertieren noch gar nicht zu sprechen. :-/
Hast du da vielleicht noch ne Idee?
mfG, Killian
_________________ Die Antwort ist 17, aber wie lautet die Frage?
|
|
Lossy eX
      
Beiträge: 1048
Erhaltene Danke: 4
|
Verfasst: So 30.09.07 20:29
Na ja. TOleGraphic ist schon seltsam. Und eigentlich wundert es mich, dass du das überhaupt bekommst. Poste mal bitte den Code wie du es lädst und auch bitte was für eine Datei du versucht zu laden. Denn ich muss gestehen. Das finde ich schon seltsam.
_________________ Nur die Menschheit ist arrogant genug, um zu glauben sie sei die einzige intelligente Lebensform im All. Wo nicht mal das nachhaltig bewiesen wurde.
|
|
Killian2004 
      
Beiträge: 72
Vista Business x64
Delphi 7 Ent. RAD Studio 2009
|
Verfasst: Do 18.10.07 19:42
Hi, danke für deine Antwort, sorry dass ich jetzt erst wieder schreibe, ich war nicht zuhause und hatte den Quellcode nicht da.
Hier ist meine Routine:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| Procedure TbMAINFORM.bindImage(); Var bufferPIC: TPicture; begin bufferPIC := TPicture.Create; Try bufferPIC.LoadFromFile(bCI_FILENAME); Image1.Picture.Bitmap.Assign(bufferPIC.Graphic); Finally bufferPIC.Free; End; End; |
bCI_FILENAME ist ein String, der wird immer gesetzt, wenn ich im TreeView ein Bild auswähle. Die Bilder sind dort einfach mit der Pfadangabe abgelegt.
Das Ding ist, das die Fehlermeldung kommt, er danach das Bild aber problemlos im TImage anzeigt. Invertieren funktioniert auch bestens, sowohl mit BMP als auch mit JPG/JPEG.
Aber warum kommt diese Fehlermeldung??
Wäre echt super, wenn du da noch mal schauen könntest, ob du einen Fehler siehst.
mfG, Killian
_________________ Die Antwort ist 17, aber wie lautet die Frage?
|
|
Lossy eX
      
Beiträge: 1048
Erhaltene Danke: 4
|
Verfasst: Do 18.10.07 20:20
Dein Problem ist die Unit AxCtrls. In dieser ist die Klasse TOleGraphic implementiert welche sich bei TPicture registriert. Und zwar mit der Endung '' (leer).
Ich würde mal die Dateinamen überprüfen. Am Ende ein Punkt oder sonst etwas komisches.
Wenn du die Unit nicht brauchst dann würde ich sie auch auskommentieren. Oder evtl mal die Reihenfolge mit der jpeg vertauschen. Am besten wäre es aber wenn sie weg wäre.
_________________ Nur die Menschheit ist arrogant genug, um zu glauben sie sei die einzige intelligente Lebensform im All. Wo nicht mal das nachhaltig bewiesen wurde.
|
|