Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Transparentes Thumbnail (https://www.delphipraxis.net/186649-transparentes-thumbnail.html)

Schwedenbitter 19. Sep 2015 19:27

Transparentes Thumbnail
 
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 :-D
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?

Bernhard Geyer 19. Sep 2015 20:17

AW: Transparentes Thumbnail
 
Nimm Pngs statt Bitmaps

Schwedenbitter 19. Sep 2015 20:53

AW: Transparentes Thumbnail
 
Zitat:

Zitat von Bernhard Geyer (Beitrag 1316357)
Nimm Pngs statt Bitmaps

Soll das gehen?
Delphi-Quellcode:
ImageList.Add()
unterstützt doch "nur" TBitmap. Wie bekomme ich dann die png's in die Liste?

Bernhard Geyer 19. Sep 2015 20:54

AW: Transparentes Thumbnail
 
Zitat:

Zitat von Schwedenbitter (Beitrag 1316360)
Zitat:

Zitat von Bernhard Geyer (Beitrag 1316357)
Nimm Pngs statt Bitmaps

Soll das gehen?
Delphi-Quellcode:
ImageList.Add()
unterstützt doch "nur" TBitmap. Wie bekomme ich dann die png's in die Liste?

Es gibt auch Imagelisten mit png-support.

Schwedenbitter 20. Sep 2015 11:10

AW: Transparentes Thumbnail
 
Zitat:

Zitat von Bernhard Geyer (Beitrag 1316361)
Zitat:

Zitat von Schwedenbitter (Beitrag 1316360)
Zitat:

Zitat von Bernhard Geyer (Beitrag 1316357)
Nimm Pngs statt Bitmaps

Soll das gehen?
Delphi-Quellcode:
ImageList.Add()
unterstützt doch "nur" TBitmap. Wie bekomme ich dann die png's in die Liste?

Es gibt auch Imagelisten mit png-support.

Danke erstmal für die Geduld - auch ggf. im Vorraus :lol:

Es funktioniert bereits mittels TBitmap; und es klappt auch mit TListView ohne den o.g. Weg, was evtl. am Windows 10 liegt. Ich habe es ausprobiert. Mein Problem liegt nicht in der Transparent als solches. Mein Problem liegt darin, dass die Transparenz sich auf eine besimmte Farbe beziehen muss.
Und genau da liegt mein Problem: bei einem s/w-Bitmap kann ich z.B. rot Benutzen. Aber welche Farbe nehme ich bei einem Farbbild? Wenn dort genau dieses rot vorkommt, dann werden diese Pixel transparent. Das wiederum sieht dann sehr unschön aus.

Also wo ist der Unterschied zum png?

Ich bin immer davon ausgegangen, dass es zwar möglicher Weise einen Unterschied bzgl. des Alpha-Kanals gibt, intern die Bilder aber immer als TBitmap behandelt werden. Mein Ziel ist auch nicht das speichern, sondern die transparente Ausgabe. Auch würde ich ungern irgend welche Dritt-Komponenten dafür installieren müssen.

EWeiss 20. Sep 2015 11:27

AW: Transparentes Thumbnail
 
Fuchsia ist eigentlich Standard.

gruss

Schwedenbitter 20. Feb 2016 17:54

AW: Transparentes Thumbnail
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich muss das Thema nochmal aufwärmen:

Danke zunächst erstmal. Ich habe es mit Fuchsia gemacht. Das funktioniert auch ganz gut. Mich stört jetzt allerdings die Darstellung in der TListView. Ich war davon ausgegangen, dass Transparenz auch bedeutet, dass markierte Bilder mit einem weißen statt transparenten Rand angezeigt werden.
Ich habe mal ein Bild angehängt, das zeigt, wie es tatsächlich aussieht und wie ich es gern hätte.

Kann mir da jemand dazu noch einen Tipp geben?


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:42 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz