| Autor |
Beitrag |
Martek
Hält's aus hier
Beiträge: 13
|
Verfasst: So 05.11.06 17:32
Hallo
Habe mir ein Beispiel geladen, mit dem man PNG Bilder öffnen könnte, aber dazu fehlt mir PNGDelphi. Überall wurde als Link dazu pngdelphi.sourceforge.net angegeben, wobei die Seite nicht mehr existiert. Wie komme ich nun an diese Datei(en)?
|
|
Chryzler
      
Beiträge: 1097
Erhaltene Danke: 2
|
Verfasst: So 05.11.06 17:50
Ich hab nur einen Ordner namens "PNGImage15" aber das ist ja warscheinlich das selbe.
Einloggen, um Attachments anzusehen!
|
|
Martek 
Hält's aus hier
Beiträge: 13
|
Verfasst: So 05.11.06 18:01
Genau das fehlte mir. Ok habs installiert und kann nun mein Programm compilieren und PNG Bilder in TImage nutzen. Ich brauch die PNG Bilder aber, um PNGs in eine ListBox einzubinden. Dazu habe ich folgendes im Internet gefunden:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31:
| procedure TForm2.ListBox1DrawItem(Control: TWinControl; Index: Integer;Rect: TRect; State: TOwnerDrawState); var Bitmap: TBitmap; OutChar: PChar; TS: TStrings; CV: TCanvas; begin If Control is TCustomListBox Then Begin TS := TCustomListBox(Control).Items; CV := TCustomListBox(Control).Canvas; End Else If Control is TCustomComboBox Then Begin TS := TCustomComboBox(Control).Items; CV := TCustomComboBox(Control).Canvas; End; OutChar := StrAlloc(length(TS.Strings[Index]) + 1); StrPCopy(OutChar, TS.Strings[Index]); with CV do begin FillRect(Rect); if TS.Objects[Index] <> nil then begin Bitmap := TS.Objects[Index] as TBitmap; BrushCopy(Bounds(Rect.Left + 2, Rect.Top + 2, Bitmap.Width, Bitmap.Height), Bitmap, Bounds(0, 0, Bitmap.Width, Bitmap.Height), Bitmap.Canvas.Pixels[0,Bitmap.Height]); end; Rect.Left := Rect.Left + Bitmap.Width + 4; Rect.Bottom := Rect.Top + Bitmap.Height + 4; DrawText(Handle, OutChar, StrLen(OutChar), Rect, dt_WordBreak); StrDispose(OutChar); end; end; |
Das ganze funktioniert super mit form2.listbox1.Items.AddObject(items[i].displ, Form2.Image1.Picture.Bitmap);
aber nur so lange ich BMP Bilder benutze, kenne mich mit dem Bilderladen in Listboxen nicht sonderlich gut aus und frage mich wie ich das ändern muss damit ich auch PNGs nutzen kann...
|
|
MrSaint
      
Beiträge: 1033
Erhaltene Danke: 1
WinXP Pro SP2
Delphi 6 Prof.
|
Verfasst: So 05.11.06 18:01
Bei SourceForge geht generell nichts verloren  Vielleicht existiert die Projekt-Homepage nicht mehr, runterladen kann man das aber immer noch: sourceforge.net/projects/pngdelphi bzw. sourceforge.net/proj...s.php?group_id=16012
MrSaint
_________________ "people knew how to write small, efficient programs [...], a skill that has subsequently been lost"
Andrew S. Tanenbaum - Modern Operating Systems
|
|
Coder
      
Beiträge: 1383
Erhaltene Danke: 1
WinXP
D2005 PE
|
Verfasst: So 05.11.06 18:06
Soruceforge scheint gerade Probleme zu haben
Hier kannst du es auch runterladen
sourceforge.net/projects/pngdelphi/
Edit// 5 Minuten zu spät
MfG
|
|
Chryzler
      
Beiträge: 1097
Erhaltene Danke: 2
|
Verfasst: So 05.11.06 18:38
|
|
Martek 
Hält's aus hier
Beiträge: 13
|
Verfasst: So 05.11.06 21:11
ok das geht auch super, jetzt noch ne letzte Frage ^^ Was ist wenn ich Das Bild nicht aus einer Datei laden will, sondern aus einem AnsiString in welchem ich bereits den Hexcode gespeichert hab laden will oder falls nötig aus einen Byte Array den ich zu verfügung hab.
Denn ich habe keinen Zugriff zu der PNG direkt, da diese in einer sogenannten EBOOT.PBP (PSP-Homebrewdatei) steckt und ich die Daten des PNGs nur direkt aus dieser Datei laden kann, weil ein Speichern auf Festplatte sich definitiv nicht lohnt wegen der Laufzeit...
Da müsste es doch ne möglichkeit geben, anstatt mit PNG.LoadFromFile(Source);
|
|
Martek 
Hält's aus hier
Beiträge: 13
|
Verfasst: Mo 06.11.06 07:16
Also habe jetzt
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7:
| x := TPNGObject.Create; x.LoadFromFile('N:\PSP\GAME\pspsourceinstaller\options.png'); y := TBitmap.Create; y := PNGToBMP(x);
if(items[i].displ <> '') then form2.listbox1.Items.AddObject(items[i].displ, y); |
gemacht und frage mich wie ich das LoadFromFile ersetzen kann durch eine LoadFromWasauchimmer ^^ Da ich wie bereits erwähnt keine Bilder eigentlich direkt zur verfügung habe, sondern eigentlich nur den Hexcode eines PNG Bildes oder wenn ich eine Umwandlung weniger mache einen TByteArray. Und das erst als PNG abzuspeichern wäre zwar möglich ist aber zu aufwändig für die Laufzeit. Vllt habt ihr sowas ja schonma gemacht =)
|
|
Lossy eX
      
Beiträge: 1048
Erhaltene Danke: 4
|
Verfasst: Mo 06.11.06 10:30
Zu deinem Problem. Du kannst die PNGs auch aus Streams laden. Also LoadFromStream. Und dann kannst du zum Beispiel das Bild aus einem Speicherbereich, Datei, Resource oder einem String laden. Allerdings nicht direkt aus einem HexString. Aber dafür könntest du dir selber eine Ableitung von TStream erstellen die dann on the fly einen Hexstring in einen richtigen umwandelt. Oder du wandelst den Hexstring um und packst diesen dann in einen eigenen Speicherbereich (entweder Speicherbereich oder String). Und dafür gäbe es ja wieder Streamableitungen (TMemoryStream oder TStringStream). Sollte also alles machbar sein. Stellt sich nur die Frage was die sinnvollste Variante ist.
Ich habe aber noch ein paar Anmerkungen zu deinen Codes.
Delphi-Quelltext 1: 2:
| y := TBitmap.Create; y := PNGToBMP(x); |
So etwas mal bitte nicht machen. PNGToBMP erzeugt selber schon ein Bild. Wozu erstellt du also vorher eines nur um es dann zu überschreiben bzw dessen Adresse? Dadurch erzeugst du nur ein Speicherloch, da du das zuvor erstellte bild nicht mehr kennst.
Allerdings frage ich mich warum man das überhaupt umwandeln muss? Die PNGDelphi ist von TGraphic abgelitten. Und mit folgendem kommt man problemlos aus.
Delphi-Quelltext 1:
| Canvas.Draw(X, Y, PNGImage); |
Dann arbeitest du mit StrAlloc, StrPCopy und StrDispose. In deinem Falle ist das aber absoluter unnötig. Folgendes reicht vollkommen.
Delphi-Quelltext 1:
| DrawText(Handle, pChar(TS.Strings[Index]), Length(TS.Strings[Index]), Rect, dt_WordBreak); |
_________________ Nur die Menschheit ist arrogant genug, um zu glauben sie sei die einzige intelligente Lebensform im All. Wo nicht mal das nachhaltig bewiesen wurde.
|
|
Martek 
Hält's aus hier
Beiträge: 13
|
Verfasst: Mo 06.11.06 16:20
ok auch umgesetzt und klappt super! Noch eine Frage: Leider sind auch offensichtlich defekte PNGs in den Dateien aus denen Ich die PNGs extrahiere, wie kann ich prüfen ob es sich tatsächlich um eine PNG handelt und nicht eine Defekte, weil das Programm ansonsten einfach aus der Schleife geht und nicht weitergeht. Will natürlich auch keine Fehlermeldung ausgeben sondern einfach nen Bild was für "kein Bild" steht.
EDIT: Habs schon selber gefunden aber danke für die restliche Hilfe jetzt geht alles wunderbar =)
|
|