Entwickler-Ecke

Multimedia / Grafik - Thumbnails mit Farbverfälschung


Noob23 - Mo 22.02.10 14:59
Titel: Thumbnails mit Farbverfälschung
Hallo zusammen,

habe mir grad ein Programm geschrieben, welches ein Bild(jpg) läd und in einem TImage fester Größe (stretch) anzeigt. Nun soll via Maus ein Ausschnitt markiert und in ein zweites Timage kopiert werden können (kleineres Thumbnail wird auch gestretcht).

Wenn ich versuche das ganze mit canvas.copyrect zu lösen gibt es farbverfälschungen.
Mit canvas.stretchdraw komm ich momentan mit den Parametern noch nicht klar, so dass der Ausschnitt stimmt - denk mir aber das das auch nicht die beste Lösung sein kann.

Ehrlich gesagt kann ich gar nicht verstehen, warum es zu diesen Verfälschungen kommt, wandelt man nicht das JPEG mit "assign" in ein BMP um?

Habe nur am Rand mit Bildern in Delphi gearbeitet, bin daher Dankbar für jeden Denkanstoss wie man die Sache besser angehen kann!

Grüße
Noob23


jakobwenzel - Mo 22.02.10 18:32

Um dir besser helfen zu können solltest du wohl deinen genauen Code zeigen und die Farbverfälschungen genauer beschreiben oder einen Screenshot anhängen.
So direkt fällt mir jedenfalls nix ein.


Noob23 - Mo 22.02.10 19:33

image1 ist 500 x 500 Pixel groß und stretch := true
image2 ist 80 x 120 Pixel (stretch auch true wobei das ja egal sein dürfte wenn ich 80 x 120 Pixel kopiere)

Kopiert wird das Thumb Mithilfe der Ereignisse OnMouseDown OnMouseUp vom Image1.

Habe wegen der Übersichtlichkeit nur die wichtigsten Code-Passagen kopiert:
Quelltext zum öffnen des JPG´s:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
  image := TJPEGImage.Create;
  try
    image.CompressionQuality := 100;
    image.LoadFromFile(Filename);
    image1.Picture.Bitmap.Assign(image);
  finally
    image.Free;
  end;


Quelltext zum kopieren des Thumbnial:

Delphi-Quelltext
1:
  image2.Canvas.CopyRect(rect(0,0,80,120),image1.Canvas,rect(x1,y1,x2,y2));                    


nur wenn wirklich ein Ausschnitt von 80x120Pixel genommen wurde gabs kein Probleme, also z.B.

Delphi-Quelltext
1:
  image2.Canvas.CopyRect(rect(0,0,80,120),image1.Canvas,rect(50,50,130,170));                    


...sonst sind Verfälschungen wie im Anhang aufgetreten.

Hoffe die Beschreibung genügt fürs Verständniss.

Besten Dank
Noob23


Noob23 - Mo 22.02.10 21:29

Hab nochmal den wesentlichen Teil in ein extra Programm gepackt.

Hier kann man zwar jetz keine JPG´s speichern aber das tut der Sache keinen Abbruch, da man den Fehler schon in den Images sehen kann.

Hab zum Vergleich eine normale TImage und eine aus der Graphics32 (es ist aber kein sehenswerter Unterschied).

Aber nachdem was die Graphics so alles leistet (wenn man die Beispiele angeschaut hat) sollte das mit den Verfärbungen doch kein Problem sein... bin leider nur noch dahinter gestiegen.

Werd mir Morgen den Resampler anschaun - vll ist der des Rätsel´s Lösung

Grüße
Noob23


Noob23 - Di 23.02.10 20:48

Mit der Anweisung 'SetStretchBltMode' scheint es nun zu funktionieren, wäre trotzdem Dankbar wenn noch jemand eine bessere Lösung parat hat und diese postet, da ich bisher nicht sicher sein kann ob es nun auch in jedem Fall funktioniert.

Grüße
Noob23