Autor Beitrag
Regan
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 2157
Erhaltene Danke: 72


Java (Eclipse), Python (Sublimetext 3)
BeitragVerfasst: Sa 28.03.09 16:18 
Hallo,

ich würde gern ein PNG-Bild in Ico konvertieren. Allerdings habe ich keinen blassen Schimmer. Kann mir da vielleicht jemand helfen?

MfG
Regan
JayEff
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2971

Windows Vista Ultimate
D7 Enterprise
BeitragVerfasst: Sa 28.03.09 16:34 
hab mal bei google "png2ico" eingebeben und kam auf das: winterdrache.de/freeware/png2ico/ eine Windows-Consolenanwendung und den Source zum selbst kompilieren - vielleicht kannst du damit was anfangen, auch wenn das sicherlich C/C++ sein wird :zustimm:

_________________
>+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.
Dude566
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1592
Erhaltene Danke: 79

W8, W7 (Chrome, FF, IE)
Delphi XE2 Pro, Eclipse Juno, VS2012
BeitragVerfasst: Sa 28.03.09 16:43 

_________________
Es gibt 10 Gruppen von Menschen: diejenigen, die das Binärsystem verstehen, und die anderen.
Regan Threadstarter
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 2157
Erhaltene Danke: 72


Java (Eclipse), Python (Sublimetext 3)
BeitragVerfasst: Sa 28.03.09 17:09 
user profile iconDude566 hat folgendes geschrieben Zum zitierten Posting springen:
www.convertico.com/

Dort kann man das machen. Mich interessiert aber die Technologie dahinter :wink: .
JayEff
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2971

Windows Vista Ultimate
D7 Enterprise
BeitragVerfasst: Sa 28.03.09 17:15 
Unter meinem Link findet sich wie gesagt ein c++ source-code aber auch eine dokumentation dazu, beides im .tar.gz Packet, welches man per WinRAR öffnen kann. Ich hoffe, damit kommst du weiter... Normalerweise würd ich mir das aus Eigeninteresse selbst durchlesen und versuchen hinter den C++ QT zu steigen aber ich muss unbedingt diese blöden !$§%& Mathe-Prüfungen bestehen :motz:

_________________
>+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.
Dude566
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1592
Erhaltene Danke: 79

W8, W7 (Chrome, FF, IE)
Delphi XE2 Pro, Eclipse Juno, VS2012
BeitragVerfasst: Sa 28.03.09 17:31 
user profile iconRegan hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconDude566 hat folgendes geschrieben Zum zitierten Posting springen:
www.convertico.com/

Dort kann man das machen. Mich interessiert aber die Technologie dahinter :wink: .


Achso, das musst du schon explizit sagen. :P

_________________
Es gibt 10 Gruppen von Menschen: diejenigen, die das Binärsystem verstehen, und die anderen.
elundril
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3747
Erhaltene Danke: 123

Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
BeitragVerfasst: Sa 28.03.09 17:33 
sodala:

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:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
function PNGtoIcon(const APNG : TPNGObject;
                      ACursor : Boolean = false;
                      AHotSpotX : Integer = 0;
                      AHotSpotY : Integer = 0) : HICON;
var
  Width, Height : Integer;
  BitmapHeader  : PBitmapV5Header;
  hNewBitmap,
  hMonoBitmap   : HBITMAP;
  Bits          : Pointer;
  x,
  y             : Integer;
  DC            : HDC;
  IconInfo      : _ICONINFO;
  Pixel         : ^Integer;
  ScanLine      : PRGBTriple;
  AlphaScanline : pByteArray;
begin

  //Die Höhe und die Breite brauchen wir später noch ein paar Mal
  Width := APNG.Width;
  Height := APNG.Height;

  //So ein Icon hat einen "Bitmap Version 5 Header"
  //(Wichtig: Als Pointer, damit er später vom CreateDIBSection "genommen" wird)
  New(BitmapHeader);

  //Die Größe der Struktur setzen, damit Windows weiß, "wie weit es gehen kann" :)
  BitmapHeader.bV5Size := sizeof(BITMAPV5HEADER);

  BitmapHeader.bV5Width := Width;
  //Wichtig: negative Höhe angeben, sonst ist das Ergebniss an der X-Achse gespiegelt
  // ... bzw. der Ursprung des Bildes an der falschen Stelle (technisch richtiger)
  BitmapHeader.bV5Height := -Height;

  //Wir haben eine Ebene
  BitmapHeader.bV5Planes := 1;
  // ... und 32bit pro Bixel
  BitmapHeader.bV5BitCount := 32;

  //Das Bild wird nicht komprimiert
  BitmapHeader.bV5Compression := BI_BITFIELDS;
  //Und nun müssen wir noch sagen, wo sich die Farben und der Alpha-Wert innerhalb
  // ... der 32bit eines Pixels befinden
  BitmapHeader.bV5RedMask := $00FF0000;
  BitmapHeader.bV5GreenMask := $0000FF00;
  BitmapHeader.bV5BlueMask := $000000FF;
  BitmapHeader.bV5AlphaMask := $FF000000;


  DC := GetDC(0);
  //Ein neues Bitmap anlegen
  hNewBitmap := CreateDIBSection( DC,
                                PBitmapInfo(BitmapHeader)^, //Hier ein wenig tricksen
                                                            // ... damit der V5Header "reinpasst"
                                DIB_RGB_COLORS, //wir haben RGB-Farben
                                Bits, //eine Pointer auf das erste Pixel
                                0//bedeutet, das wir das Bitmap im RAM haben wollen
                                0); // ... und deswegen brauchen wir auch kein Offset
  Dispose(BitmapHeader); //der Header hat seine Schuldigkeit getan
  ReleaseDC(0,dc); // ... und auch unser DC

  //man nehme ein Bitmap, welches wir später als Maske "verkaufen"
  hMonoBitmap:=CreateBitmap(Width,Height,1,1,nil);

  //Und los gehts beim ersten Pixel
  Pixel := Bits;
  for y := 0 to Height-1 do
  begin
    //aus dem PNG die Farbwerte einer Zeile holen
    ScanLine := APNG.Scanline[y];
    // ... und dazu die Alpha-Werte
    AlphaScanline := APNG.AlphaScanline[y];
    for x := 0 to Width - 1 do
    begin
      //ein Pixel-Wert setzt sich aus ...
      Pixel^ := AlphaScanLine[x];  // ... dem Alpha-Wert, ...
      Pixel^ := Pixel^ shl 8;
      Inc(Pixel^, Scanline^.rgbtRed);  // ... einem Rot-Anteil, ...
      Pixel^ := Pixel^ shl 8;
      Inc(Pixel^, Scanline^.rgbtGreen); // ... einem Grün-Anteil, ...
      Pixel^ := Pixel^ shl 8;
      Inc(Pixel^, Scanline^.rgbtBlue); // ... und einem Blau-Anteil zusammen

      //weiter gehts mit dem nächsten Pixel innerhalb unseres RAM-Bitmaps
      Inc(Pixel);

      //und auch ein neues Pixel von unserem PNG währe nicht schlecht
      Inc(ScanLine);
    end;
  end;

  //Mit der IconInfo-Struktur können wir einige Eigenschaften des Icons setzen

  // ... z.B. ob es ein Cursor ...
  IconInfo.fIcon := not ACursor;
  if ACursor then
  begin
    // ... mit einem Hotspot ist
    IconInfo.xHotspot := AHotSpotX;
    IconInfo.yHotspot := AHotSpotY;
  end;
  //Aber auf jeden Fall brauchen wir ein Bitmap das als Maske dient
  IconInfo.hbmMask := hMonoBitmap;
  // ... und natürlich ein Bitmap mit dem eigentlichen Bild
  IconInfo.hbmColor := hNewBitmap;

  //Et voila ... ein schönes neues Icon
  Result := CreateIconIndirect(IconInfo);

  //natürlich räumen wir nachher auf
  DeleteObject(hNewBitmap);
  DeleteObject(hMonoBitmap);

  //Wichtig: Das Icon, das zurückgegeben wird muss auch mit DestroyIcon
  // ... freigegeben werden, wenn wir es nicht mehr brauchen.
end;


Benötigte Units: PNGImage

Was der Code tut? er convertiert ein PNG in ein 32 bit Icon mit Alphakanal. ;-)

Quelle: unbekannt

_________________
This Signature-Space is intentionally left blank.
Bei Beschwerden, bitte den Beschwerdebutton (gekennzeichnet mit PN) verwenden.
Regan Threadstarter
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 2157
Erhaltene Danke: 72


Java (Eclipse), Python (Sublimetext 3)
BeitragVerfasst: Sa 28.03.09 22:07 
Ich schau mir das mal morgen an, bin jetzt doch etwas müde.
Vielen Dank aber trotzdem :zustimm: .
Regan Threadstarter
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 2157
Erhaltene Danke: 72


Java (Eclipse), Python (Sublimetext 3)
BeitragVerfasst: Sa 11.04.09 21:00 
So, ich habe mir das angeschaut.
1. Ich habe keine PNGImage.pas gefunden, die bei mir einigermaßen läuft, ohne, dass ich den halben Quelltext auskomentieren muss, aber egal.

user profile iconelundril hat folgendes geschrieben Zum zitierten Posting springen:

ausblenden Delphi-Quelltext
 
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
{ ... }
  BitmapHeader.bV5AlphaMask := $FF000000;


  DC := GetDC(0);
  //Ein neues Bitmap anlegen
  hNewBitmap := CreateDIBSection( DC, //Hier kommt der Fehler
                                PBitmapInfo(BitmapHeader)^, //Hier ein wenig tricksen
                                                            // ... damit der V5Header "reinpasst"
                                DIB_RGB_COLORS, //wir haben RGB-Farben
                                Bits, //eine Pointer auf das erste Pixel
                                0//bedeutet, das wir das Bitmap im RAM haben wollen
                                0); // ... und deswegen brauchen wir auch kein Offset
  Dispose(BitmapHeader); //der Header hat seine Schuldigkeit getan
  ReleaseDC(0,dc); // ... und auch unser DC

  //man nehme ein Bitmap, welches wir später als Maske "verkaufen"
  hMonoBitmap:=CreateBitmap(Width,Height,1,1,nil);


Folgender Fehler:
Zitat:

---------------------------
Benachrichtigung über Debugger-Exception
---------------------------
Im Projekt ist eine Exception der Klasse EZeroDivide mit der Meldung 'Gleitkommadivision durch Null' aufgetreten.
---------------------------
Anhalten Fortsetzen Hilfe
---------------------------


Edit:
Fehler besteht nicht mehr. Habe mir die aktuelle Version nochmal gezogen.

Edit2:
Fehler besteht wieder.
Regan Threadstarter
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 2157
Erhaltene Danke: 72


Java (Eclipse), Python (Sublimetext 3)
BeitragVerfasst: So 12.04.09 12:53 
Ich habe das jetzt mal beobachtet. Wenn ich einen OpenPictureDialog einmal geöffnet habe und mir dort einmal ein PNG-Bild in der Vorschau anzeigen lassen habe, dann funktioniert es ohne Fehler. Hab ich keine Vorschau gewählt, dann schmiert mir das Programm an eben dieser Stelle ab.
Ich wäre sehr froh, wenn mir da jemand weiterhelfen würde :) .

Edit:
Fehler behoben. Funktion einfach von dort nehmen.
turboPASCAL
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 193
Erhaltene Danke: 1

Win XP / Vischda
D6 PE / D2005 PE
BeitragVerfasst: So 12.04.09 17:23 
-> [url=www.delphi-forum.de/...php?p=558030#558030] [Tool] - Png To Icon ;)
[/url]

_________________
Nein, ich bin nicht der turboPASCAL aus der DP, ich seh nur so aus... :P