Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi PNGs oder Dateien allgemein in EXE einbinden und auslesen (https://www.delphipraxis.net/164427-pngs-oder-dateien-allgemein-exe-einbinden-und-auslesen.html)

entwickler 11. Nov 2011 20:24

PNGs oder Dateien allgemein in EXE einbinden und auslesen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo DP!

Ich habe schon einige Seiten durchgelesen um mich über Ressourcendateien zu informieren (siehe z.B. http://www.delphipraxis.net/264-wie-...e-dateien.html oder http://www.delphipraxis.net/21887-re...erstellen.html). Trotzdem bin ich nicht weiter gekommen.

Anfängliche Schwierigkeiten konnte ich jetzt schon überwinden (--> http://www.delphipraxis.net/164262-p...ert-nicht.html), doch jetzt hat mir sivon erzählt, dass PNGs transparenz unterstützen (was bei dem Projekt durchaus sinnvoll sein kann). Daher möchte ich nun eine PNG- Datei statt einer JPG- Datei verwenden.

So, und jetzt meine Frage:

Welche Möglichkeit eignet sich um eine PNG- Grafikdatei (bzw. sämtliche Dateien) in eine Anwendung einzubinden und anschließend auch wieder auszulesen? Ein Beispielprogramm (siehe Anhang) enthält zwar eine PNG- Datei, doch das Programm läuft bei mir irgendwie nicht [Fehlermeldung beim ausführen im explorer und anschließendem klicken auf Button1: Ressource TTestBar wurde nicht gefunden!].

Sonst finde ich auch in anderen Foren einige Themen zum erstellen einer *.res Datei (ist mir auch schon erfolgreich gelungen :lol: :
http://www.swissdelphicenter.ch/de/showcode.php?id=302), jedoch kann ich mit dem Befehl PlaySound wahrscheinlich nicht an eine Grafik kommen. Wie dann?

Luckie 11. Nov 2011 21:03

AW: PNGs oder Dateien allgemein in EXE einbinden und auslesen
 
TRessourceStream ist dein Freund.

Bernhard Geyer 11. Nov 2011 23:22

AW: PNGs oder Dateien allgemein in EXE einbinden und auslesen
 
Wir speichern unseren PNG-Icon-Pool in einer speziellen Unit in TImages bzw. Imagelisten mit PNG-Support (z.B. PNGImagelist von LMD).
Ist m.E. schöner und einfacher zu handhaben als mit Ressourcen zu arbeiten.

entwickler 12. Nov 2011 11:50

AW: PNGs oder Dateien allgemein in EXE einbinden und auslesen
 
@ Bernhard Geyer

Aber ich habe keine PNG- Komponente für Delphi 5 Prof. Und wie soll ich eine Grafik in einer Unit speichern?

@ Luckie

Könntest du mir ein Anwendungsbeispiel geben?

Bernhard Geyer 12. Nov 2011 11:54

AW: PNGs oder Dateien allgemein in EXE einbinden und auslesen
 
Zitat:

Zitat von entwickler (Beitrag 1135837)
Aber ich habe keine PNG- Komponente für Delphi 5 Prof.

Dann mußt du dir eine besorgen. Es gab mal kostenlose Kompos auch für D5, welche eingestellt wurden weil Embaracadero die Sourcen gekauft hat und ab D200x selbst mitliefert. Oder du kauft dir Kompos wie LMD-Elpack welche PNGs-Kompos mitbringen.

Zitat:

Zitat von entwickler (Beitrag 1135837)
Und wie soll ich eine Grafik in einer Unit speichern?

Wenn die Unit eine Datenmodul oder Formular ist geht das schon :-)
Noch ein paar Hilfsfunktionen und schon hat man's einfach mit Multi-Use von Grafiken.

Uwe Raabe 12. Nov 2011 11:59

AW: PNGs oder Dateien allgemein in EXE einbinden und auslesen
 
Zitat:

Zitat von entwickler (Beitrag 1135837)
Aber ich habe keine PNG- Komponente für Delphi 5 Prof. Und wie soll ich eine Grafik in einer Unit speichern?

Es gibt diverse PNG-Komponentensammlungen, die das gewünschte leisten. Allerdings bin ich mir nicht sicher, ob die auch noch Delphi 5 unterstützen.

entwickler 12. Nov 2011 12:06

AW: PNGs oder Dateien allgemein in EXE einbinden und auslesen
 
Gibt es sonst keine Möglichkeit, eine einfache PNG Datei in ein einfaches TImage zu packen?

Luckie 12. Nov 2011 12:11

AW: PNGs oder Dateien allgemein in EXE einbinden und auslesen
 
Zitat:

Zitat von entwickler (Beitrag 1135837)
@ Luckie

Könntest du mir ein Anwendungsbeispiel geben?

Es dürfte genug Beispiele hier im Forum geben.

Bernhard Geyer 12. Nov 2011 12:13

AW: PNGs oder Dateien allgemein in EXE einbinden und auslesen
 
Zitat:

Zitat von entwickler (Beitrag 1135844)
Gibt es sonst keine Möglichkeit, eine einfache PNG Datei in ein einfaches TImage zu packen?

Solange du in der IDE keine PNG-Unterstützung hast - nein.
Irgendein stück Quellcode muss ja dafür sorgen das die in der TImage geladene PNG zur laufzeit auch korrekt interpretiert wird.

Micha88 12. Nov 2011 12:27

AW: PNGs oder Dateien allgemein in EXE einbinden und auslesen
 
Ich handhabe es folgendermaßen (nicht schön, aber funktioniert):

ich erstelle mir Resource-Dateien und kompiliere diese mit in eine DLL-Datei ein. In dieser DLL-Datei ist dann z.B. eine Funktion, welche eine Grafik aus einer Resource-Datei lädt, und das das THandle zurückgibt.

Thom 12. Nov 2011 14:27

AW: PNGs oder Dateien allgemein in EXE einbinden und auslesen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hier ist die Original-PNG-Unit (Version 1.56) von Gustavo Huffenbacher Daud, bevor sie in Delphi integriert wurde. Die Lizenz besagt:
Zitat:

This component may be distributed freely over the internet only when containing the exact same files from the original packaging.
Das ist der Fall. Da Lizenzen nicht rückwirkend für ältere Versionen geändert werden können, kann diese Version ohne Probleme verwendet werden.

Uwe Raabe 12. Nov 2011 14:42

AW: PNGs oder Dateien allgemein in EXE einbinden und auslesen
 
Und hier gibt es eine passende Komponentensammlung, die wohl auch für Delphi 5 noch funktioniert. Sie enthält allerdings noch eine ältere Version der Png-Library von Gustavo Daud.

DeddyH 12. Nov 2011 14:45

AW: PNGs oder Dateien allgemein in EXE einbinden und auslesen
 
Die habe ich ihm bereits per Mail zugeschickt ^^. Übrigens gibt es dafür auch einen Fix von mir.

Uwe Raabe 12. Nov 2011 14:49

AW: PNGs oder Dateien allgemein in EXE einbinden und auslesen
 
Zitat:

Zitat von DeddyH (Beitrag 1135877)
Übrigens gibt es dafür auch einen Fix von mir.

Ich weiß!

DeddyH 12. Nov 2011 14:54

AW: PNGs oder Dateien allgemein in EXE einbinden und auslesen
 
Ich weiß, dass Du das weißt ;). Ich habe den Fix nur der Vollständigkeit halber verlinkt, falls jemand später mal über diesen Thread stolpert.

entwickler 13. Nov 2011 13:52

AW: PNGs oder Dateien allgemein in EXE einbinden und auslesen
 
Okay, soweit schon einmal ein herzliches Dankeschön an euch alle!

Ich habe die Komponente TPNGButton bei mir installieren können und die bringt auch keine Fehler hervor. Hier einmal der Text:

Delphi-Quellcode:
procedure GetPokemon(Pokemon : TPokemon; Image : TImage);
var
  Bitmap : TBitmap;
  x, y   : Integer;
  ResStr : TResourceStream;
begin
    ResStr := TResourceStream.Create(HInstance, 'Pokedex', RT_RCDATA);
  try
    Pokemon_Pictures.PNGButton1.ImageNormal.LoadFromStream(ResStr);
  finally
    ResStr.Free;
  end;
    Pokemon_Pictures := TPokemon_Pictures.Create(Application);
      try
        Bitmap := TBitmap.Create;
          try
            Bitmap.Assign(Pokemon_Pictures.PNGButton1.ImageNormal.Canvas);
            Pokemon_Pictures.Image1.Picture.Bitmap := Bitmap;
            if (Pokemon>=Bisasam) and (Pokemon<=Arceus) then
                begin
                y := Ord(Pokemon) div 25;
                x := Ord(Pokemon) Mod 25;
                Image.Canvas.CopyRect(rect(0, 0, 80, 80), BitMap.Canvas, rect(x*80,y*80, (x+1)*80,(y+1)* 80));
                end
              else
            if Pokemon = Arceus then Image.Canvas.CopyRect(rect(0, 0, 80, 80), BitMap.Canvas, rect(1520, 1080, 17*80, 17*80))
            else
                raise Exception.Create('Angefordertes Pokemon konnte nicht gefunden werden!');
        finally
          Bitmap.Free;
        end;
    finally
      Pokemon_Pictures.Free;
    end;
end;
Nun bekomme ich immer die Fehlermeldung, dass die Ressource nicht gefunden werden kann. In der Ressourcendatei steht:

Pokedex PNG "Pokedex2.png"

Wo liegt hier wieder der Fehler, und wie kann ich die PNG- Grafik in einen Bitmap konvertieren?

DeddyH 13. Nov 2011 14:05

AW: PNGs oder Dateien allgemein in EXE einbinden und auslesen
 
Hast Du die *.rc auch kompiliert und die daraus resultierende *.res in Dein Programm eingebunden? Ansonsten wäre es vielleicht einfacher, einfach eine PNGImagelist zu nehmen, Deine Datei dort einzufügen und dann darauf zuzugreifen.

entwickler 13. Nov 2011 14:17

AW: PNGs oder Dateien allgemein in EXE einbinden und auslesen
 
Ja. Folgendes habe ich in die *.dpr unter der schon existierenden Compileranweisung hinzugefügt:

Delphi-Quellcode:
{$R Pokedex.RES}
oder muss das in die Unit?

DeddyH 13. Nov 2011 14:25

AW: PNGs oder Dateien allgemein in EXE einbinden und auslesen
 
Du kannst es auch in die Unit packen, aber das sollte keine Rolle spielen. Vielleicht hängst Du die *.res einmal als ZIP hier an, dann kann man mal nachsehen, woran es liegen könnte.

entwickler 13. Nov 2011 14:41

AW: PNGs oder Dateien allgemein in EXE einbinden und auslesen
 
Liste der Anhänge anzeigen (Anzahl: 3)
die *.res oder die *.rc?

Egal, ich hänge gleich alles an :lol:

Uwe Raabe 13. Nov 2011 14:49

AW: PNGs oder Dateien allgemein in EXE einbinden und auslesen
 
Diese beiden Zeilen scheinen mir nicht zusammenzupassen:

Zitat:

ResStr := TResourceStream.Create(HInstance, 'Pokedex', RT_RCDATA);
und

Zitat:

Pokedex PNG "Pokedex2.png"
Sollte das nicht

Pokedex RCDATA "Pokedex2.png"

heißen?

entwickler 13. Nov 2011 15:24

AW: PNGs oder Dateien allgemein in EXE einbinden und auslesen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Okay, habe ich abgeändert, doch der Fehler ändert sich nicht :?
Vielleicht hilft ja ein Bild des Fehlers, um die Fehlerquelle herauszufinden [Die Anwendung lässt sich normal starten, aber wenn ich auf den Button vom Testprogramm klicke:]:

DeddyH 13. Nov 2011 15:47

AW: PNGs oder Dateien allgemein in EXE einbinden und auslesen
 
Moment, DLL? Was hast Du denn wo drin?

entwickler 13. Nov 2011 16:07

AW: PNGs oder Dateien allgemein in EXE einbinden und auslesen
 
In die DLL ist die *.res eingebunden; die DLL soll der Testanwendung das 80x80 Pixel große Bild als PNG übergeben (da muss ich noch gucken, wie ich das mache). Zwischendurch musste die PNG- Datei in einen Bitmap umgewandelt werden, damit ich aus dem Bild einen Part ausschneiden kann.

DeddyH 13. Nov 2011 16:17

AW: PNGs oder Dateien allgemein in EXE einbinden und auslesen
 
Nun mal langsam: wenn es eine reine Ressourcen-DLL ist, dann übergibt sie ja nichts. Und wenn nicht, kannst Du keine Objektinstanzen zwischen DLL und Hauptprogramm austauschen, dafür müsstest Du eine *.bpl erzeugen.

Bummi 13. Nov 2011 16:32

AW: PNGs oder Dateien allgemein in EXE einbinden und auslesen
 
1. Dass Du die Resource so nicht laden kannst liegt daran dass das Bild nicht unter RC DATA sondern unter PNG liegt.
2. Du erzeugst weiterhin diese Formular, diesmal greifst Du sogar auf PNGButton1 bevor es erzeugt ist
3. Wen Du das Bild irgendwann geladen hast wirst Du es nicht schaffen ein transparentest Bild mit den bisherigen Mitteln zurückzugeben.


Mit ist nicht ganz klar was das mit der DLL soll, wenn Du den Ansatz weiterverfolgen willst würde ich Dir GDI+ ans Herz legen, ist frei herunterladbar.
Hier könntest Du in ein dynamische erzeugtes GPIMage direkt PNG's laden, der DLL würdest das Handle des ZielCanvas übergeben, die Zielkoordinaten, den Quellauschnitt und die DLL könnte direkt transparent in eine beliebiges Zielcanvas malen.

DeddyH 13. Nov 2011 17:18

AW: PNGs oder Dateien allgemein in EXE einbinden und auslesen
 
Liste der Anhänge anzeigen (Anzahl: 1)
So, ich habe das jetzt mal mit einer Ressourcen-DLL gemacht.
DLL:
Delphi-Quellcode:
library imagedll;

{$R pokedex.res}

begin
end.
Anwendung mit einem TImage drauf:
Delphi-Quellcode:
uses pngimage;

procedure TForm1.ButtonClick(Sender: TObject);
var
  DLLHandle: THandle;
  ResStream: TResourceStream;
  bmp: TBitmap;
  png: TPngImage;
begin
  DLLHandle := LoadLibrary(PChar(ExtractFilePath(ParamStr(0)) + 'imagedll.dll'));
  if DLLHandle <> 0 then
    try
      ResStream := TResourceStream.Create(DLLHandle, 'POKEDEX', RT_RCDATA);
      try
        ResStream.Position := 0;
        png := TPngImage.Create;
        try
          png.LoadFromStream(ResStream);
          bmp := TBitmap.Create;
          try
            bmp.Width := 80;
            bmp.Height := 80;
            bmp.PixelFormat := pf32Bit;
            BitBlt(bmp.Canvas.Handle, 0, 0, bmp.Width, bmp.Height, png.Canvas.Handle, 0, 0, SRCCOPY);
            Image1.Picture.Assign(bmp);
          finally
            bmp.Free;
          end;
        finally
          png.Free;
        end;
      finally
        ResStream.Free;
      end;
    finally
      FreeLibrary(DLLHandle);
    end;
end;
Wobei man sich natürlich fragen kann, ob man wirklich die Gesamtgrafik lädt und daraus dann den entsprechenden Ausschnitt herauskopiert oder das nicht vorher macht und die enthaltenen 493 Bildchen einzeln in die Ressource packt (siehe Anhang).

entwickler 14. Nov 2011 09:09

AW: PNGs oder Dateien allgemein in EXE einbinden und auslesen
 
Danke, DeddyH.

[Ich kanns im moment nicht ausprobieren, hab delphi nicht zur Hand]
Der Programmcode klingt erstmal ganz gut, aber was bewirkt dieses

Zitat:

Delphi-Quellcode:
DLLHandle: THandle;

? Das verstehe ich daran nicht.
PS: Danke auch f. d. Einzelgrafiken!

DeddyH 14. Nov 2011 09:13

AW: PNGs oder Dateien allgemein in EXE einbinden und auslesen
 
Aus dem MSDN:
Zitat:

Prozesse rufen LoadLibrary (oder AfxLoadLibrary) auf, um eine explizite Verknüpfung mit einer DLL herzustellen. Wenn der Aufruf erfolgreich ist, ordnet die Funktion die angegebene DLL im Adressbereich des aufrufenden Prozesses zu und gibt ein Handle für die DLL zurück. Dieses Handle kann zusammen mit anderen Funktionen für die explizite Verknüpfung verwendet werden, z. B. GetProcAddressund FreeLibrary.

Sir Rufo 14. Nov 2011 10:02

AW: PNGs oder Dateien allgemein in EXE einbinden und auslesen
 
Und wenn man sauberen Code haben möchte, dann legt man sich das in eine eigenen Funktion und nicht direkt in ein GUI-Event der Form ;)

DeddyH 14. Nov 2011 10:06

AW: PNGs oder Dateien allgemein in EXE einbinden und auslesen
 
Es muss es aber zuerst generell funktionieren, gell?

Sir Rufo 14. Nov 2011 13:10

AW: PNGs oder Dateien allgemein in EXE einbinden und auslesen
 
Zitat:

Zitat von DeddyH (Beitrag 1136050)
Es muss es aber zuerst generell funktionieren, gell?

Eine Funktion, die nicht funktioniert ist ja dann eigentlich auch keine :mrgreen:

DeddyH 14. Nov 2011 13:14

AW: PNGs oder Dateien allgemein in EXE einbinden und auslesen
 
procedure, function, malfunction :mrgreen:

Nee, is schon klar, das war ja auch nur ein Beispiel von mir, wie man generell das 1. Teilbild aus dem großen Ressourcenbild herauskopieren kann. Ich fände es sowieso sinniger, die Bildchen einzeln in die Ressourcen zu packen, das dürfte um Einiges einfacher zu handeln sein.

entwickler 14. Nov 2011 19:39

AW: PNGs oder Dateien allgemein in EXE einbinden und auslesen
 
Kann ich die Grafiken, wenn ich sie einzeln in die *.rc (bzw. *.res)- Datei einbinde, auch im png-Format übergeben? Und muss die *.rc dann nicht 493 Zeilen lang sein?
Okay, das mit dem konvertieren und zurechtschneiden kann man sich dann sparen... :wink:

wicht 14. Nov 2011 20:13

AW: PNGs oder Dateien allgemein in EXE einbinden und auslesen
 
Zitat:

Kann ich die Grafiken, wenn ich sie einzeln in die *.rc (bzw. *.res)- Datei einbinde, auch im png-Format übergeben?
Was meinst du mit "übergeben"? Vielleicht ist das noch nicht ganz klar: mit RCDATA in der .rc-Datei sagst du einfach, dass Daten (eine Folge von Bytes aus der angegebenen Datei) in die .res-Datei gepackt werden sollen. Dabei weiß keiner, ob es sich nun um PNG, BMP, JPEG oder eine Text-Datei handelt. Und diese Folge von Bytes findet sich in der .dll-Datei dann wieder. Sie sind zu dieser Zeit im png-Format. Wenn du diese Daten nun in deinem Programm lädst (mit dem gezeigten Code), ist das erstmal nur eine Folge von Bytes (im TResourceStream), der dann von der PNG-Komponente geladen wird, und von dieser in ein Bild "interpretiert" wird. Ich wüsste nicht, wie das anders gehen soll.

Zitat:

Und muss die *.rc dann nicht 493 Zeilen lang sein?
Wie lang die .rc-Datei wird, hängt davon ab, wieviele Bilder du in diese aufnimmst. So ganz verstehe ich die Frage nicht. Bei einem Bild ist es eben eine Zeile, bei 100 Bildern sind es eben 100 Zeilen. Die .rc-Datei ist ja nur der "Quelltext" für die .res-Datei, die "kompiliert" wird. Und die .res-Datei wächst natürlich mit der Anzahl der Bilder, die in sie hinein "kompiliert" wird.

Zitat:

Okay, das mit dem konvertieren und zurechtschneiden kann man sich dann sparen... :wink:
Zurechtschneiden/Konvertieren kannst du machen, bevor du die Dinge in die .res-Datei kloppst, oder eben zur Laufzeit, nachdem das TPNGImage aus dem TResourceStream erstellt wurde. Vernünftiger ist es wohl, das Konvertieren/Zurechtschneiden vor dem "kompilieren" in die .res-Datei zu machen, sofern das Ergebnis der Konvertierung in allen Szenarien (bei allen Benutzern) am Ende das selbe sein soll.

HTH

entwickler 14. Nov 2011 20:35

AW: PNGs oder Dateien allgemein in EXE einbinden und auslesen
 
Oh, jetzt hab ich das (überarbeitete) Programm mal laufen lassen, und pngimage.pas kennt kein TPNGImage, ich habe es mal durch TPNGObject ersetzt (ich denke mal, du meinst das).

Wenn ich jetzt im Testprogramm auf Button1 klicke, kommt zwar keine Fehlermeldung mehr, aber eine Grafik zeigt mir das Programm auch nicht an. Ich habe keine Ahnung, wie ich jetzt an die Grafik komme.

Ach so, @wicht

Ich habe gedacht, dass ich das Laden von mehreren hundert (!) Grafiken vielleicht irgendwie einfacher beschreiben kann, und mit dem zurechtschneiden/ konvertieren hast du auch recht. 8-)

wicht 14. Nov 2011 23:16

AW: PNGs oder Dateien allgemein in EXE einbinden und auslesen
 
Zitat:

Ich habe gedacht, dass ich das Laden von mehreren hundert (!) Grafiken vielleicht irgendwie einfacher beschreiben kann, und mit dem zurechtschneiden/ konvertieren hast du auch recht.
Du könntest dir für das Erstellen der .rc-Datei z.B. eine Batch-Datei/ein Skript/ein Delphi-Programm bauen. Dann sparst du dir viel Tipparbeit. Wenn die Resourcen danach z.B. Bild_1 bis Bild_200 heißen, könntest du sie z.B. in einer Schleife laden - for i := 1 to 200 do LoadImage('Bild_' + IntToStr(i)); wobei du das Bild in LoadImage() z.B. einer Liste anfügst...

Luckie 14. Nov 2011 23:25

AW: PNGs oder Dateien allgemein in EXE einbinden und auslesen
 
Ich würde es ganz einfach machen für einen Anfänger: In mehreren Bitmaps und ohne DLL. Die rc-Datei würde ich von Hand erstellen. Ist zwar mehr Arbeit, aber erst mal einfacher.

Medium 15. Nov 2011 00:47

AW: PNGs oder Dateien allgemein in EXE einbinden und auslesen
 
Wozu überhaupt die DLL hier? Resource-DLLs nutzt man, wenn man die betreffenden Resourcen austauschbar halten muss (und selbst da ist diese Praxis mächtig aus der Mode gekommen) - das sehe ich hier irgendwie nicht gegeben. Also: Einfach an die EXE kleben und ab dafür, oder einfach die Bilder "as they are" in ein Unterverzeichnis, wenn sie denn separat vom Programm austauschbar bleiben sollen.

DeddyH 15. Nov 2011 07:00

AW: PNGs oder Dateien allgemein in EXE einbinden und auslesen
 
Ich habe gestern Abend unter Delphi 7 (die älteste Version, die ich noch habe) eine kleine Demoanwendung erstellt (mit DLL und den PngComponents). Falls noch Interesse besteht kann ich sie heute nach Feierabend ja mal hochladen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:29 Uhr.
Seite 1 von 2  1 2      

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