AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

PNG zur Laufzeit in ImageList einfügen

Ein Thema von bezarre · begonnen am 1. Mai 2010 · letzter Beitrag vom 12. Feb 2011
Antwort Antwort
Seite 1 von 4  1 23     Letzte »    
bezarre

Registriert seit: 30. Apr 2010
33 Beiträge
 
RAD-Studio 2009 Arc
 
#1

PNG zur Laufzeit in ImageList einfügen

  Alt 1. Mai 2010, 13:04
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.
Micha
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: PNG zur Laufzeit in ImageList einfügen

  Alt 1. Mai 2010, 13:07
In welcher (Code-)Zeile?
Markus Kinzler
  Mit Zitat antworten Zitat
bezarre

Registriert seit: 30. Apr 2010
33 Beiträge
 
RAD-Studio 2009 Arc
 
#3

Re: PNG zur Laufzeit in ImageList einfügen

  Alt 1. Mai 2010, 13:10
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
Micha
  Mit Zitat antworten Zitat
Andreas L.
(Gast)

n/a Beiträge
 
#4

Re: PNG zur Laufzeit in ImageList einfügen

  Alt 1. Mai 2010, 13:13
Delphi-Quellcode:
  //falsch
      png.Create;
        image.create;

  //richtig
      png := TPNGObject.Create;
        image := TBitmap.create;
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.453 Beiträge
 
Delphi 12 Athens
 
#5

Re: PNG zur Laufzeit in ImageList einfügen

  Alt 1. Mai 2010, 13:14
png := TPngObject.Create;
image := TBitmap.create;

png.LoadFromFile('images\bild1.png');
image.Assign(png);
Imagelist.Add(image,nil);
png.Free;
image.Free;
Uwe Raabe
  Mit Zitat antworten Zitat
bezarre

Registriert seit: 30. Apr 2010
33 Beiträge
 
RAD-Studio 2009 Arc
 
#6

Re: PNG zur Laufzeit in ImageList einfügen

  Alt 1. Mai 2010, 13:16
Hallo,

dankeschön

Funktioniert.

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

Gruß
Micha
Micha
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#7

Re: PNG zur Laufzeit in ImageList einfügen

  Alt 1. Mai 2010, 13:22
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
Markus Kinzler
  Mit Zitat antworten Zitat
Andreas L.
(Gast)

n/a Beiträge
 
#8

Re: PNG zur Laufzeit in ImageList einfügen

  Alt 1. Mai 2010, 13:28
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
Angehängte Dateien
Dateityp: zip x2cl_165.zip (290,4 KB, 77x aufgerufen)
  Mit Zitat antworten Zitat
David Martens

Registriert seit: 29. Sep 2003
205 Beiträge
 
Delphi XE Enterprise
 
#9

AW: PNG zur Laufzeit in ImageList einfügen

  Alt 10. Feb 2011, 15:58
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:
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:
  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.

Geändert von David Martens (10. Feb 2011 um 16:01 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.063 Beiträge
 
Delphi 12 Athens
 
#10

AW: PNG zur Laufzeit in ImageList einfügen

  Alt 10. Feb 2011, 16:13
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)
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu (10. Feb 2011 um 16:15 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 4  1 23     Letzte »    


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:54 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