Seite 1 von 1
Wie png als ico speichern - platformübergreifend
Verfasst: 14.01.2011 17:45
von Dostej
Hallo zusammen
Ich möchte Bilder als ico speichern können, sodas man sie als Icon in den Gadgets unter Win nutzen kann. Das Programm soll aber auf allen OS laufen, daher geht das Beispiel von SRod im englischen Forum leider nicht. Ich blick ehrlich gesagt die WinAPI auch zu wenig um zu verstehen was er das so macht.
So, dann habe ich mir das Fileformat angeschaut - die Idee war die Pixel einfach halt in dem Format zu speichern (

naiv zu denken, das könnte einfach so gehen, ich weiss) , das mit dem Header usw. verstehe ich soweit noch (das sit bei SRods Code auch noch soweit nachvollziehbar), dann bei dem XOR und AND Bitmap endet es allerdings.
Mein Anliegen also:
Hat jemand ein Stück (reinen PB-Code), mit dem ein Bild in PB (geladen oder erstellt) als ico speichern kann (Das wäre die super Lösung

)
Oder kann mir jemand erklären, wie das mit dem Fileformat bei den Bitmaps ohne WInAPI zu macht ist (Das wäre immer hilfreich, wenn auch unbequemer, da ich das dann selbst zusammenstöpseln müsste...

)
Anyway - wäre um Hilfe froh
Re: Wie png als ico speichern - platformübergreifend
Verfasst: 14.01.2011 17:54
von STARGÅTE
Eigentlich sollte diese Header-Beschreibung für *.ico reichen:
ICO (file format)
zumindest konnte ich damit damals auch früher Images als Icon mit PB speichern lassen.
Einfach n Struktur erstellen, die Parameter setzen und die Daten des Bilds hineinpacken, dann alles in einer Datei speichern ...
Re: Wie png als ico speichern - platformübergreifend
Verfasst: 14.01.2011 18:08
von STARGÅTE
Hier mal ein schnells Beispiel ohne Struktur und Prozedur, einfach per Hand:
Code: Alles auswählen
CreateFile(1, "Beispiel.ico")
; Header
WriteWord(1, 0) ; Null
WriteWord(1, 1) ; 1=Ico, 2=Cur
WriteWord(1, 1) ; ImageCount
; Image
WriteAsciiCharacter(1, 32) ; Width
WriteAsciiCharacter(1, 32) ; Height
WriteAsciiCharacter(1, 0) ; 0=TrueColor
WriteAsciiCharacter(1, 0) ; Null
WriteWord(1, 1)
WriteWord(1, 32) ; BitsPerColor
WriteLong(1, 32*32*4+40) ; Width*Height*(BytesPerColor)+40
l = Loc(1)
WriteLong(1, l+4)
; BMP-Header
WriteLong(1, 40) ; SizeOfStructure
WriteLong(1, 32) ; Width
WriteLong(1, 64) ; 2*Height
WriteWord(1, 1) ; Layers
WriteWord(1, 32) ; BitsPerColor
WriteLong(1, 0)
WriteLong(1, 0)
WriteLong(1, 0)
WriteLong(1, 0)
WriteLong(1, 0)
WriteLong(1, 0)
; BMP-Daten
For x = 0 To 31
For y = 0 To 31
WriteLong(1, RGBA(y*8,x*8,y*8,x*8))
Next
Next
CloseFile(1)
Re: Wie png als ico speichern - platformübergreifend
Verfasst: 14.01.2011 18:54
von freak
Seit PB 4.40 kann man überall PNG verwenden. PB macht daraus automatisch einen icon wenn das nötig ist.
Re: Wie png als ico speichern - platformübergreifend
Verfasst: 14.01.2011 19:49
von STARGÅTE
@freak
Das stimmt nicht ganz.
Das MDIGadget nimmt für ein neues Fenster (AddGadgetItem) kein PNG an, sonden wirklich nur .ico
Code: Alles auswählen
Enumeration
#Image_ICO
#Image_PNG
#Window
#Menu
#Gadget
EndEnumeration
InitNetwork()
UsePNGImageDecoder()
ReceiveHTTPFile("http://data.unionbytes.de/plugin.png", GetTemporaryDirectory()+"plugin.png")
LoadImage(#Image_PNG, GetTemporaryDirectory()+"plugin.png")
ReceiveHTTPFile("http://data.unionbytes.de/plugin.ico", GetTemporaryDirectory()+"plugin.ico")
LoadImage(#Image_ICO, GetTemporaryDirectory()+"plugin.ico")
OpenWindow(#Window, 0, 0, 400, 300, "MDIGadget", #PB_Window_SystemMenu|#PB_Window_ScreenCentered|#PB_Window_SizeGadget|#PB_Window_MaximizeGadget)
CreateMenu(#Menu, WindowID(#Window))
MenuTitle("Child")
MDIGadget(#Gadget, 0, 0, 0, 0, 0, 0, #PB_MDI_AutoSize)
AddGadgetItem(#Gadget, #PB_Default, "PNG", ImageID(#Image_PNG))
ImageGadget(#PB_Any, 0, 0, 16, 16, ImageID(#Image_PNG))
AddGadgetItem(#Gadget, #PB_Default, "ICO", ImageID(#Image_ICO))
ImageGadget(#PB_Any, 0, 0, 16, 16, ImageID(#Image_ICO))
Repeat : Until WaitWindowEvent()=#PB_Event_CloseWindow
An der Stelle gleich mal die Bitte, dort auch PNGs nutzbar zu machen

Re: Wie png als ico speichern - platformübergreifend
Verfasst: 15.01.2011 09:21
von Dostej
Vielen Dank Stargate, ich glaube ich habs soweit verstanden (am Beispiel).
Nicht das mit dem AND and Xor Bitmap, aber da das scheinbar auch ohne geht... gut.
@ freak
Danke für die Info. Ich habe das in der Hilfe irgendwie nicht gesehen. Aber das ist cool...