![]() |
Transparentes Thumbnail
Hallo,
obwohl ich mir unter anderem die Themen ![]() ![]() 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 ![]() 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:
Welchen Farbwert kann/sollte man nutzen, um dieses Problem zu lösen?
// 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; Oder wie löst man dieses Problem anders? |
AW: Transparentes Thumbnail
Nimm Pngs statt Bitmaps
|
AW: Transparentes Thumbnail
Zitat:
Delphi-Quellcode:
unterstützt doch "nur" TBitmap. Wie bekomme ich dann die png's in die Liste?
ImageList.Add()
|
AW: Transparentes Thumbnail
Zitat:
|
AW: Transparentes Thumbnail
Zitat:
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. |
AW: Transparentes Thumbnail
Fuchsia ist eigentlich Standard.
gruss |
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 08:45 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz