![]() |
[gelöst] Transparenz in TListView übernehmen
Liste der Anhänge anzeigen (Anzahl: 2)
Hallo,
ich befülle zur Laufzeit eine
Delphi-Quellcode:
und lasse sie in einer
TImageList
Delphi-Quellcode:
anzeigen. Leider sind das Bilder von einem Scanner, die in unterschiedlichen Größen und Formaten (Hoch- und Querformat) geliefert werden. Um alles abzudecken, erzeuge ich quadratische Thumbnails.
TListView
So weit, so gut. Mich stört allerdings die Optik. Ich probiere schon stundelang rum und habe unter anderem hier im Forum nachgelesen, an welchen Stellen man drehen kann. Allerdings finde ich keine Lösung. Den Quellcode habe ich angehängt und 2 Bilder - ein Bild mit dem Ist-Zustand und ein (nachbearbeitetes), wie ich es gern hätte. Kann man dieses Ziel überhaupt erreichen und - falls ja - wie? |
AW: Transparenz in TListView übernehmen
Liste der Anhänge anzeigen (Anzahl: 1)
Also, gehen tut das. Siehe angehängter Screenshot aus einem Programm von mir, das das allerdings mit TPNGImage und Scanline macht. Gerade habe ich nicht so viel Zeit, aber später kann ich mal schauen.
Kleiner Tipp, den du mal probieren kannst: - Fülle die Bitmap in der transparenten Farbe - Zeiche des Bild darauf - Setze jetzt erst die Transparenzeigenschaften und zwar nur, wenn NH bzw. NW <> ThumbSize - Setze Transparenzmodus auf automatisch oder gar nicht (gerade nicht sicher) - Nutze ImageList.AddMasked mit deine transparenten Farbe |
AW: Transparenz in TListView übernehmen
Danke für die tollen Ideen!
Zitat:
Ich dachte immer, Delphi würde die Bilder intern im Speicher alle als (T)Bitmap behandeln? Damit dürfte die Frage TPNGImage/Scanline also egal sein. Aber wenn ich es nicht hinbekomme, würde mich diese Lösung dennoch interessieren. Zitat:
Zitat:
Zitat:
Transparezmodus meint vermutlich
Delphi-Quellcode:
? Da gibt es "nur"
TImageList.DrawingStyle
Delphi-Quellcode:
(Vcl.ImgList).
TDrawingStyle = (dsFocus, dsSelected, dsNormal, dsTransparent);
Delphi-Quellcode:
führt dazu, dass der weiße Hintergrund nicht mehr blau ist. Allerdings bleiben die Bilder faktisch quadratisch. Und das zweite Problem besteht darin, dass sich diese Thumbnails ändern können. Deshalb bin ich leider auf
Tmagelist.AddMasked(aBMP, clTrans);
Delphi-Quellcode:
angewiesen. Und hier finde ich leider nichts bzw. nichts einfach verständliches, wie man ein solches MaskBitmap "richtig" anlegt.
TImageList.Replace(ImageIndex, aBMP, MaskBMP);
Es wäre also wirklich toll, wenn Du mir den Trick verraten würdest, wie Du/man diese TListView bastelst, in der die blaue Farbe bei ausgewähltem Bild bis ans Bild heranreicht. Falls es noch eine Rolle spielt. Aktuell habe ich das mit XE5 kompiliert. Nicht dass es da irgend einen Bug gibt, der mir das ganze evtl. vermiest. Man weiß ja nie. |
AW: Transparenz in TListView übernehmen
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
Delphi-Quellcode:
hat hier einen Bug, dass ein Alphablending zu schwarz stattfindet, halbtransparente Bereiche werden also dunkler. Daher kopiere ich zusätzlich (Alphakanal funktioniert ja) die Farbdaten noch einmal per Scanline. TPNGImage unterscheidet sich von TBitmap vor allem darin, dass Scanline und Alphascanline getrennt werden.
Assign
/Edit: Der vorherige Absatz war Blödsinn, daher korrigiert. Hier die Funktion, falls sie jemand braucht:
Delphi-Quellcode:
function PNGToBMP(PNG: TPngImage; const Free: Boolean = False): Graphics.TBitmap;
var i, j: Integer; begin // Fixes a bug that causes BMP transparency to look very dark und ugly for // areas after conversion to BMP Result := Graphics.TBitmap.Create; Result.Assign(PNG); if PNG.Header.ColorType = COLOR_RGBALPHA then for i := 0 to PNG.Height - 1 do for j := 0 to PNG.Width - 1 do begin TByteArray(Result.ScanLine[i]^)[j*4] := TByteArray(PNG.Scanline[i]^)[j*3]; TByteArray(Result.ScanLine[i]^)[j*4+1] := TByteArray(PNG.Scanline[i]^)[j*3+1]; TByteArray(Result.ScanLine[i]^)[j*4+2] := TByteArray(PNG.Scanline[i]^)[j*3+2]; end; if Free then PNG.Free; end; Zitat:
|
AW: Transparenz in TListView übernehmen
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
Zitat:
Ich habe mir die Quellen nochmal angesehen. Dort gibt es eine Möglichkeit, neue Bitmaps inkl. Maskenfarbe mit
Delphi-Quellcode:
einzufügen. Man kann also entweder vorher das alte Bild löschen und das neue an dessen Position setzen oder man setzt erst das neue Bild dort rein und löscht das (dann) folgende Bild - letzteres schont wohl die Resourcen.
ImageList1.InsertMasked(Idx, aBMP, clTrans);
Ich habe den Code nebst Ersetzungsbild nochmal zum Testen angehängt. Danke für Deine ausführliche Hilfe!:dp: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:16 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