Autor Beitrag
Martek
Hält's aus hier
Beiträge: 13



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1097
Erhaltene Danke: 2



BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 13



BeitragVerfasst: 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:

ausblenden volle Höhe Delphi-Quelltext
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1033
Erhaltene Danke: 1

WinXP Pro SP2
Delphi 6 Prof.
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1383
Erhaltene Danke: 1

WinXP
D2005 PE
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1097
Erhaltene Danke: 2



BeitragVerfasst: So 05.11.06 18:38 
user profile iconMartek hat folgendes geschrieben:
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...

Das ist nicht verwunderlich, da der Code auf Canvas zugreifen will. D.h. du musst erst intern die PNG in ein Bitmap umwandeln. Etwa so:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
function PNGToBMP(PNG: TPNGImage): TBitmap;
begin
  result := TBitmap.Create;
  result.Assign(PNG);
end;
Martek Threadstarter
Hält's aus hier
Beiträge: 13



BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 13



BeitragVerfasst: Mo 06.11.06 07:16 
Also habe jetzt

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1048
Erhaltene Danke: 4



BeitragVerfasst: 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.
ausblenden 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.
ausblenden 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.
ausblenden 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 Threadstarter
Hält's aus hier
Beiträge: 13



BeitragVerfasst: 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 =)