Wie png als ico speichern - platformübergreifend

Probleme beim Erstellen von 3D-Modellen und Texturen, keine Ahnung womit man Musik macht? Dies ist dein Forum.
Benutzeravatar
Dostej
Beiträge: 529
Registriert: 01.10.2004 10:02
Kontaktdaten:

Wie png als ico speichern - platformübergreifend

Beitrag 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 ( :oops: 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 :D )

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... 8) )

Anyway - wäre um Hilfe froh
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Wie png als ico speichern - platformübergreifend

Beitrag 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 ...
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Wie png als ico speichern - platformübergreifend

Beitrag 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)
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
freak
PureBasic Team
Beiträge: 766
Registriert: 29.08.2004 00:20
Wohnort: Stuttgart

Re: Wie png als ico speichern - platformübergreifend

Beitrag von freak »

Seit PB 4.40 kann man überall PNG verwenden. PB macht daraus automatisch einen icon wenn das nötig ist.
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Wie png als ico speichern - platformübergreifend

Beitrag 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 :allright:
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
Dostej
Beiträge: 529
Registriert: 01.10.2004 10:02
Kontaktdaten:

Re: Wie png als ico speichern - platformübergreifend

Beitrag 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...
Antworten