Einzelnen Beitrag anzeigen

Schwedenbitter

Registriert seit: 22. Mär 2003
Ort: Finsterwalde
622 Beiträge
 
Turbo Delphi für Win32
 
#1

Transparentes Thumbnail

  Alt 19. Sep 2015, 19:27
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?
Alex Winzer
  Mit Zitat antworten Zitat