Hallo,
obwohl ich mir unter anderem die Themen
[1],
[2] durchgelesen habe, finde ich keine Lösung für mein Problem:
Ich kann anhand der Beispielcodes ein ein-/mehrfarbiges Bitmap transparent machen und auch darstellen. Ich möchte aber mit meinem Programm Thumbnails erstellen, die später als LargeImages in eine TListView gemalt werden. Ich hoffe, dass das dann auch
so klappt
Das Problem dabei ist, dass ich die Farben dieser Bilder nicht kenne. Es besteht also die Gefahr, dass ich eine Farbe transparent setze, die in diesem Bild schon existiert. Also dachte ich mir, ich benutze clNone. Damit klappt es aber leider nicht. Unter den Bildern sind auch schwarz/weiß Bilder, so dass diese beiden Farben leider auch ausfallen.
Mein Code sieht so aus:
Delphi-Quellcode:
// Erstellt ein quadratisches Thumbnail ----------------------------------------
// Bei angegebener Farbe wird diese Farbe der Hintergrund. Ohne Farbangabe soll
// der Hintergrund transparent werden.
Procedure MakeThumb(Const Bitmap, Thumbnail: TBitmap; MaxSize: Integer;
Const BackColor: TColor = clNone);
Var
NH, NW : Integer;
pt : TPoint;
Begin
Thumbnail.Assign(nil); // ggf. altes Bild löschen
Thumbnail.Width:= MaxSize; // Höhe einstellen
Thumbnail.Height:= MaxSize; // Breite einstellen
Thumbnail.PixelFormat:= pf24bit; // http://www.delphipraxis.net/1144235-post4.html
If (BackColor = clNone) Then // => Hintergrund transparent
Begin
Thumbnail.Transparent:= True; // Transparenz setzen
Thumbnail.TransparentMode:= tmFixed; // Zuweisung von Hand
Thumbnail.TransparentColor:= clRed; // die Farbe wird transparent
End;
Thumbnail.Canvas.Brush.Color:= clRed; // Hintergrundfarbe setzen
Thumbnail.Canvas.FillRect(Thumbnail.Canvas.ClipRect);
GetBrushOrgEx(Thumbnail.Canvas.Handle, pt);
SetStretchBltMode(Thumbnail.Canvas.Handle, HALFTONE);
SetBrushOrgEx(Thumbnail.Canvas.Handle, pt.x, pt.y, @pt);
If (Bitmap.Width < Bitmap.Height) Then // Hochformat
Begin
NH:= MaxSize; // Höhe = Maximalwert
NW:= Bitmap.Width * NH Div Bitmap.Height; // Breite berechnen
StretchBlt( // Bitmap verkleinert kopieren
Thumbnail.Canvas.Handle, // Ziel-Bitmap
((MaxSize - NW) Div 2), 0, NW, NH, // ggf. nach innen rücken
Bitmap.Canvas.Handle, // Quell-Bitmap
0, 0, Bitmap.Width, Bitmap.Height, // komplettes Bild kopieren
SRCCOPY); // Kopiermodus
End
Else
Begin
NW:= MaxSize; // Breite = Maximalwert
NH:= Bitmap.Height * NW Div Bitmap.Width; // Höhe berechnen
StretchBlt( // Bitmap verkleinert kopieren
Thumbnail.Canvas.Handle, // Ziel-Bitmap
0, ((MaxSize - NH) Div 2), NW, NH, // ggf. nach unten rücken
Bitmap.Canvas.Handle, // Quell-Bitmap
0, 0, Bitmap.Width, Bitmap.Height, // komplettes Bild kopieren
SRCCOPY); // Kopiermodus
End;
End;
Welchen Farbwert kann/sollte man nutzen, um dieses Problem zu lösen?
Oder wie löst man dieses Problem anders?