Autor Beitrag
Killian2004
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 72

Vista Business x64
Delphi 7 Ent. RAD Studio 2009
BeitragVerfasst: 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:
ausblenden 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:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 77
Erhaltene Danke: 1

W2K, WIN XP, WIN XPe; WIN7
(D1;D2;D5;) D6 Ent.; D2009 Ent.
BeitragVerfasst: Fr 21.09.07 08:09 
Vorher in Bitmap umwandeln.
Killian2004 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 72

Vista Business x64
Delphi 7 Ent. RAD Studio 2009
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Fr 21.09.07 22:01 
Probier's mal so:
ausblenden Delphi-Quelltext
1:
BMP{:TBitmap}.Assign(JPG{:TJpegImage});					

_________________
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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 72

Vista Business x64
Delphi 7 Ent. RAD Studio 2009
BeitragVerfasst: Mo 24.09.07 08:59 
Hi, also

ausblenden Delphi-Quelltext
1:
BMP{:TBitmap}.Assign(JPG{:TJpegImage});					


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??? :cry:

mfG, Killian

_________________
Die Antwort ist 17, aber wie lautet die Frage?
Lossy eX
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1048
Erhaltene Danke: 4



BeitragVerfasst: 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.
ausblenden 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'); // laden

    Image1.Picture.Bitmap.Assign(Pic.Graphic); // zuweisen

    InvertBMP(Image1.Picture.Bitmap); // invertieren
  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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 72

Vista Business x64
Delphi 7 Ent. RAD Studio 2009
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1048
Erhaltene Danke: 4



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 72

Vista Business x64
Delphi 7 Ent. RAD Studio 2009
BeitragVerfasst: 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:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
Procedure TbMAINFORM.bindImage();
Var
 bufferPIC: TPicture;
begin
 { Laden des ausgewählten Bildes }
 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1048
Erhaltene Danke: 4



BeitragVerfasst: 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.