Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi PNG in ICO umwandeln (https://www.delphipraxis.net/67914-png-ico-umwandeln.html)

Balu der Bär 21. Apr 2006 19:10


PNG in ICO umwandeln
 
Moin,

ich suche eine schnelle und unkomplizierte Möglichkeit png-Grafiken ins das ico-Format umzuwandeln.
Leider habe ich von Bildbearbeitung mit Delphi keinerlei Ahnung, außer TBitmap (was mir nicht viel hilft, oder?) kenne ich da nichts weiter. Kann mir jemand helfen ?

Danke schonmal,

marabu 21. Apr 2006 19:44

Re: PNG in ICO umwandeln
 
Hallo Balu,,

das OpenSource Projekt PNGImage kann dir helfen - oder willst du es zu Fuß machen?

Grüße vom marabu

Balu der Bär 21. Apr 2006 19:56

Re: PNG in ICO umwandeln
 
Danke marabu, ich guck mir das mal an. :-)

Balu der Bär 21. Apr 2006 20:18

Re: PNG in ICO umwandeln
 
Ich hab das Package jetzt installiert, die Komponente PNGButton wirde bei mir registriert. Bloß wie kann ich die PNG`s jetzt umwandeln ?

mkinzler 21. Apr 2006 20:21

Re: PNG in ICO umwandeln
 
Es wurde zusätzlich die Klasse TPngImage installiert. Hierbei handelt es sich um einen ImageFilter füt TImage. D.H. jetzt müsstset mit einem TImage Png-Grafiken Laden können.

Balu der Bär 21. Apr 2006 20:33

Re: PNG in ICO umwandeln
 
Jupp, dass geht.

Nur einfach per image1.Picture.Icon.savetofile(); kann ich das leider nicht als Ico speichern...

Balu der Bär 23. Apr 2006 11:21

Re: PNG in ICO umwandeln
 
**push**

Hab mittlerweile in nem anderen Thread ne Möglichkeit gefunden Bitmaps in Icons umzuwandeln, wie man PNG aber in Bitmaps umwandelt ist mir weiterhin ein Rätsel.

DGL-luke 23. Apr 2006 11:24

Re: PNG in ICO umwandeln
 
Die TPicture-Erweiterungen sind alle aufs Lesen und Darstellen ausgelegt. Du bekommst da glaub ich keine pixel-werte... Du müsstest also nach eine Komponeente suchen, die dir ein PNG so entpackt, dass du die einzelnen Pixel bekommst.

EDIT: Jack Goman versteckt sich aber ganz schön... aber Google weiß alles ;) http://delphi.icm.edu.pl/authors/a0003227.htm
Da gibts eine pngunit, die genau das macht, was du willst ;)

Khabarakh 23. Apr 2006 11:53

Re: PNG in ICO umwandeln
 
Zitat:

Zitat von DGL-luke
Du müsstest also nach eine Komponeente suchen, die dir ein PNG so entpackt, dass du die einzelnen Pixel bekommst.

Das muss jede Komponente, die ein PNG anzeigen kann, zwangsweise können, also auch PNGImage. Einfach ein TPNGObject erstellen und per Draw auf ein TBitmap übertragen.

turboPASCAL 23. Apr 2006 11:57

Re: PNG in ICO umwandeln
 
Jupp, so ist das. ;)

Was das eigentliche Problem wird ist wohl das speichern eines Icons mit mehr als 16 Farben... :gruebel:

Balu der Bär 23. Apr 2006 12:00

Re: PNG in ICO umwandeln
 
Das ist kein Problem, Lösung dafür steht hier: *klick*

Aber ich finde einfach keine schnelle und unkomplizierte Möglichkeit PNG´s ind BMP´s umzuwandeln. :wall:

DGL-luke 23. Apr 2006 12:01

Re: PNG in ICO umwandeln
 
Zitat:

Zitat von Khabarakh
Das muss jede Komponente, die ein PNG anzeigen kann, zwangsweise können, also auch PNGImage. Einfach ein TPNGObject erstellen und per Draw auf ein TBitmap übertragen.

ahaaaaa.... so geht das! danke! das werd ich wohl noch mal brauchen können...

Balu der Bär 23. Apr 2006 12:04

Re: PNG in ICO umwandeln
 
Zitat:

Das muss jede Komponente, die ein PNG anzeigen kann, zwangsweise können, also auch PNGImage. Einfach ein TPNGObject erstellen und per Draw auf ein TBitmap übertragen.
Ähm wie genau "übertrage" ich das denn ? :gruebel:

turboPASCAL 23. Apr 2006 12:06

Re: PNG in ICO umwandeln
 
Zitat:

Zitat von Balu der Bär
Das ist kein Problem, Lösung dafür steht hier: *klick*

Aber ich finde einfach keine schnelle und unkomplizierte Möglichkeit PNG´s ind BMP´s umzuwandeln. :wall:

Und ich such mir schon Wund... :wall:

:mrgreen:

Robert Marquardt 23. Apr 2006 12:06

Re: PNG in ICO umwandeln
 
Delphi-Quellcode:
function WriteImage(FileName: string; WriteStream: TStream): Boolean;
var
  Factor: Integer;
  Pic: TPicture;
  Bmp, Tmp: TBitmap;
  Gif: TJvGIFImage;
  SizeTest: TJclNullStream;
begin
  Result := FileExists(FileName);
  if Result then
  begin
    Pic := TPicture.Create;
    Bmp := TBitmap.Create;
    Tmp := TBitmap.Create;
    Gif := TJvGIFImage.Create;
    SizeTest := TJclNullStream.Create;

    Pic.LoadFromFile(FileName);
    Bmp.Width := Pic.Width;
    Bmp.Height := Pic.Height;
    Bmp.Canvas.Draw(0, 0, Pic.Graphic);

    Factor := 1;
    repeat
      Tmp.Width := Bmp.Width div Factor;
      Tmp.Height := Bmp.Height div Factor;
      SetStretchBltMode(Bmp.Canvas.Handle, HALFTONE);
      SetStretchBltMode(Tmp.Canvas.Handle, HALFTONE);
      StretchBlt(Tmp.Canvas.Handle, 0, 0, Tmp.Width, Tmp.Height,
        Bmp.Canvas.Handle, 0, 0, Bmp.Width, Bmp.Height, SRCCOPY);
      Gif.Assign(Tmp);
      SizeTest.Size := 0;
      Gif.SaveToStream(SizeTest);
      Inc(Factor);
    until (SizeTest.Size < 65536) and (Tmp.Height <= 240) and (Tmp.Width < 240);
    Gif.SaveToStream(WriteStream);
    Pic.Free;
    Bmp.Free;
    Tmp.Free;
    Gif.Free;
    SizeTest.Free;
  end;
end;
Der obenstehende Code laedt ein Bild in allen von TGraphic unterstuetzten Formaten (das variiert je nach installierten Komponenten).
Das Bild wird in eine Bitmap umgewandelt und dann solange verkleinert bis es kleiner als 240x240 ist und im GIF-Format kleiner als 64K ist.
Das frisch erfundene TJclNullStream speichert keine Daten sondern nur die Stream-Groesse und -Position.
Am ende wird das Bild als GIF gespeichert.

Wichtig ist das fuer das Zielformat auch das Schreiben unterstuetzt wird. Das ist nicht bei allen Implementierungen eines Formates fuer TGraphic der Fall.
Es ist auch wichtig das die Zuweisung einer TBitmap an das Zielformat ("Gif.Assign(Tmp);") unterstuetzt wird.


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:46 Uhr.

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