Delphi-PRAXiS
Seite 1 von 4  1 23     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   PNG zur Laufzeit in ImageList einfügen (https://www.delphipraxis.net/150954-png-zur-laufzeit-imagelist-einfuegen.html)

bezarre 1. Mai 2010 12:04


PNG zur Laufzeit in ImageList einfügen
 
Hallo,

diesmal möchte ich eine PNG Datei einlesen lassen und sie dann in eine ImageList einfügen.

Delphi-Quellcode:
procedure build_imagelist(ImageList:TImageList);
  var
  image : TBitmap;
  PNG : TPNGOBject;
  i :Integer;
  begin
   
        png.Create;
        image.create;
        png.LoadFromFile('images\bild1.png');
        image.Assign(png);
        Imagelist.Add(image,nil);
        png.Destroy;
        image.Destroy;

  end;
Ich habe mir das jetzt irgendwie so gedacht, kriege aber leider immer eine Fehlermeldung, dass eine Speicherverletzung auftritt. Was genau fehlt mir noch bzw. was ist richtig an dem, was ich gemacht habe?

Gruß
Micha

PS nochmal danke für eure bisherige Hilfe.

mkinzler 1. Mai 2010 12:07

Re: PNG zur Laufzeit in ImageList einfügen
 
In welcher (Code-)Zeile?

bezarre 1. Mai 2010 12:10

Re: PNG zur Laufzeit in ImageList einfügen
 
Hallo,

in garkeiner Zeile. Compilieren und erzeugen passt beides.
Aber beim Starten kommt dann folgende Meldung:

Zugriffsverletzung bei Adresse {blabla} im Modul start.exe. Lesen von Adresse {blabla}.

Ich lasse die Funktion übrigens bei onShow starten.

Gruß
Micha

Andreas L. 1. Mai 2010 12:13

Re: PNG zur Laufzeit in ImageList einfügen
 
Delphi-Quellcode:
  //falsch
      png.Create;
        image.create;

  //richtig
      png := TPNGObject.Create;
        image := TBitmap.create;

Uwe Raabe 1. Mai 2010 12:14

Re: PNG zur Laufzeit in ImageList einfügen
 
png := TPngObject.Create;
image := TBitmap.create;

png.LoadFromFile('images\bild1.png');
image.Assign(png);
Imagelist.Add(image,nil);
png.Free;
image.Free;

bezarre 1. Mai 2010 12:16

Re: PNG zur Laufzeit in ImageList einfügen
 
Hallo,

dankeschön :-)

Funktioniert.

Und wie sorge ich dafür, dass die Hintergründe Transparent bleiben?

Gruß
Micha

mkinzler 1. Mai 2010 12:22

Re: PNG zur Laufzeit in ImageList einfügen
 
Zitat:

Aber beim Starten kommt dann folgende Meldung:
Beschäftige dich mal mit dem Thema Debugger.
Zitat:

Und wie sorge ich dafür, dass die Hintergründe Transparent bleiben?
So nicht, da Bitmaps keine Transparenz kennen

Andreas L. 1. Mai 2010 12:28

Re: PNG zur Laufzeit in ImageList einfügen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Jetzt frag ich nochmal: Welche Delphi-Version hast du? (Das kannst du auch in deinem Profil eintragen damit es jeder sehen kann)

Ab Delphi 2009 (oder ab 2007?) unterstützt die IDE von Haus aus PNG-Bilder. Es sollte also auch eine Möglichkeit geben der ImageList ein PNG hinzu zufügen ohne es vorher in ein Bitmap oder ähnliches umzuwandeln.

Da ich aber auch schon jede Menge Probleme mit der ImageList hatte, verwende ich nur noch die X²GraphicList (siehe Anhang). Da kann man alles rein laden 8-)

David Martens 10. Feb 2011 14:58

AW: PNG zur Laufzeit in ImageList einfügen
 
Wir haben auf Delphi XE umgestellt. Leider habe ich das Problem der Transparenz von PNGs in Imagelisten.

Folgende Situation:

PNGs sind in einer ImageDLL gespeichert:

Auszug auf der rc Datei:
Delphi-Quellcode:
cut             RCDATA  "cut.png"

Um diese Dll habe ich eine Klasse geschrieben die die Bilder dann als TPngImage zurückgibt:
Delphi-Quellcode:
function TImageDll.GetPNG(Name: string): TPngImage;
var
  hLib : THandle;
begin
  try
    hLib := LoadLibrary(PChar(fImageDll));

    Result := TPngImage.Create;
    Result.LoadFromResourceName(hLib, Name);
  except
  end;
end;
Das wird dann wiederum in eine TImagelist gespeichert:
Delphi-Quellcode:
  ilStandard.Add(sImageDll.GetPNG('cut'), nil);
ilStandard ist eine von mir erweiterte TImagelist, die zusätzlich beim Add ein GrayscaleImage in die Imagelist für die deaktivierten Bilder packt.
Delphi-Quellcode:
function TMyImageList.Add(Image, Mask: TBitmap): Integer;
begin
  Result := inherited Add(Image, Mask);

  if Assigned(FDisabledImages) then
  begin
    ConvertColors(Image);

    if Assigned(Mask) then
      ConvertColors(Mask);

    FDisabledImages.Add(Image, Mask);
  end;
end;
Ich habe schon mit Transparenz hin und her probiert, aber nichts funktioniert.


Bisher habe ich die PNGs gleich in Bitmaps umgewandelt, aber dabei geht ja die Transparenz verloren. Ich habe mich da mit TransperentColor = clBtnFace beholfen, aber das sieht im Menü leider nicht so gut aus. Die Bilder werden in TMainMenu und in TControlBar benutzt. Die TToolButtons sehen dann gut aus, aber leider ist im Menü der Hintergrund nicht (immer) clBtnFace.

Delphi-Quellcode:
function TImageDll.LoadPNG(Name: string; TransperentColor : TColor): Graphics.TBitmap;
var
  hLib    : THandle;
  PNGImage : TPngImage;
begin
  Result := Graphics.TBitmap.Create;
  try
    hLib := LoadLibrary(PChar(fImageDll));

    PNGImage := TPngImage.Create;
    PNGImage.LoadFromResourceName(hLib, Name);
    PNGImage.Transparent := true;

    Result.Canvas.Brush.Color := TransperentColor;
    Result.Width := PNGImage.Width;
    Result.Height := PNGImage.Height;
    Result.Canvas.StretchDraw(Rect(0, 0, PNGImage.Width, PNGImage.Height), PNGImage);

    PNGImage.Free;
  except
    On E : EPNGCouldNotLoadResource do
      ShowMessageFmt(rcDLLFailure, [sDLLPath + rcImgDll]);
  end;
end;
Ich hoffe ich hab mich verständlich ausgedrückt. Hier nochmal eine kurze Zusammenfassung was ich machen will:
1. PNGs als Resource in eine DLL
2. PNGs mit LoadFromResourceName laden
3. PNGs in einer TImageList speichern UND dabei nicht den Alphachannel verlieren
3b. möglicherweise gleich GrayscaleImage erstellen und in eine zweite TImageList speichern
4. Bilder korrekt in TMainMenu, TToolButtons, ... anzeigen MIT richtigem Alphachannel

Mein Knackpunkt ist Nummer 3.

Vielen dank schon mal für die Antworten

David

P.S.: Uwes Vorschlag hat leider nicht geklappt.

himitsu 10. Feb 2011 15:13

AW: PNG zur Laufzeit in ImageList einfügen
 
Ganz spontan geantwortet: delphis TImageList kennt keine derartige Transparenz (Alpha-Kanal), wie sie im PNG verbaut ist.

TImageList kennt nur RGB-Bitmap mit zusätzlichem Schwarz/Weiß-Masken-Bitmap (wür ein ICON also ein Bitmap mit den Farben und Nocheines mit einer Maske für die volltranzparenten Pixel)


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:24 Uhr.
Seite 1 von 4  1 23     Letzte »    

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