windows icon-format

Für allgemeine Fragen zur Programmierung mit PureBasic.
5mware
Beiträge: 47
Registriert: 14.12.2015 15:16

windows icon-format

Beitrag von 5mware »

leute eine frage,

ist es irgendwie möglich eine muster-window-ico-datei nachträglich per code zu duplizieren, während dessen aber die abbilder durch andere zu ersetzen, ohne die api zu verwenden. mir geht folgendes durch den kopf:

ich erstelle einen muster-ico-datei. in dieser sind bereits alle relevanten icon-varianten korrekt abgelegt.

später erstelle ich einen programm in der man einfach per öffnen-dialog eine grafik-datei auswählt, daraus erstelle ich intern dann mehrere kopien in den geforderten größen (für klassische icons 16, 24, 32, 48 und für neuere zusätzlich 128).

auf jeden fall das programm erstellt erst einmal eine kopie der muster-datei im arbeitsspeicher. dabei wird der header als ein memory-block geladen und genauso auch die einzelnen abbilder etc. dann werden die abbilder durch das erwünschte bild im jeweiligen variante ersetzt. danach wird der ganze spaß als neue datei zusammengestzt. voila neues icon ist fertig.

die idee ist zwar simpel, mir fehlen dazu folgende infos. ich werde aus

https://en.wikipedia.org/wiki/BMP_file_format
und
https://docs.microsoft.com/de-de/previo ... v=msdn.10)

nicht ganz schlau.

mir geht es darum die muster-datei beim einlesen richtig zu browsen und die entsprechenden anteile als eigenständige memory-blocks ersteinmal in den speicher zu laden. natürlich das ganze auch weider auf dieselbe art zusammenzusetzen.

hinsichtlich des bitmaps für windows kann ich ja das einfach von pb nutzen. für os/2 müsste ich es aber wohl selbst reprogrammieren. ich bräuchte anhaltspunkte wie ich selbst so einen bitmap-abbild ohne api erzeugen, abspeichern und laden kann. die farben werden ja da mit einer farbpalette gemacht. das müsste ich dann auch selbst regeln.

hat jemand eine idee?
Benutzeravatar
Mijikai
Beiträge: 754
Registriert: 25.09.2016 01:42

Re: windows icon-format

Beitrag von Mijikai »

Hier ein Beispiel für (PNG) ICO - Dateien.

Code:

Code: Alles auswählen


EnableExplicit

DeclareModule ICON
  
  ;ICO MODULE draft - create a (single) PNG *.ico!
  ;Author Mijikai 
  ;PureBasic v.5.62 (x64)
  
  Declare.i Create(Image.i)
  Declare.i Save(*icon,File.s)
  Declare.i Free(*icon)
  
EndDeclareModule

Module ICON
  
  EnableExplicit
  
  UsePNGImageEncoder()
  
  Structure ICON_DIR
    idReserved.u;   // Reserved (must be 0)
    idType.u    ;       // Resource Type (1 for icons)
    idCount.u   ;      // How many images?
  EndStructure
  
  Structure ICON_DIR_ENTRY
    bWidth.a;          // Width, in pixels, of the image
    bHeight.a;         // Height, in pixels, of the image
    bColorCount.a;     // Number of colors in image (0 if >=8bpp)
    bReserved.a  ;     // Reserved ( must be 0)
    wPlanes.u    ;     // Color Planes
    wBitCount.u  ;     // Bits per pixel
    dwBytesInRes.l;    // How many bytes in this resource?
    dwImageOffset.l;   // Where in the file is this image?
  EndStructure
  
  Procedure.i Create(Image.i)
    Protected Width.i
    Protected Height.i
    Protected *Offset
    Protected *Buffer
    Protected BufferSize
    Protected *icon.ICON_DIR
    Protected *entry.ICON_DIR_ENTRY
    If IsImage(Image)
      Width = ImageWidth(Image)
      Height = ImageHeight(Image)
      If Width = Height
        If Width = 16 Or Width = 32 Or Width = 48 Or Width = 128
          *Buffer = EncodeImage(Image,#PB_ImagePlugin_PNG,#Null,32)
          If *Buffer
            BufferSize = MemorySize(*Buffer)
            *Offset = SizeOf(ICON_DIR) + SizeOf(ICON_DIR_ENTRY)
            *icon = AllocateMemory(*Offset + BufferSize)
            If *icon
              *icon\idType = 1
              *icon\idCount = 1
              *entry = *icon + SizeOf(ICON_DIR)
              *entry\bWidth = Width
              *entry\bHeight = Height
              *entry\wBitCount = 32
              *entry\dwBytesInRes = BufferSize
              *entry\dwImageOffset = *Offset
              CopyMemory(*Buffer,*icon + *Offset,BufferSize)
              FreeMemory(*Buffer)
              ProcedureReturn *icon
            EndIf 
            FreeMemory(*Buffer)
          EndIf
        EndIf
      EndIf
    EndIf
  EndProcedure
  
  Procedure.i Save(*icon,File.s)
    Protected Handle.i
    Protected Bytes.i
    Protected Result.i
    If *icon And File
      Handle = CreateFile(#PB_Any,File)
      If Handle
        Bytes = MemorySize(*icon)
        Result = Bool(WriteData(Handle,*icon,Bytes) = Bytes)
        CloseFile(Handle)
        If Not Result
          DeleteFile(File)
        EndIf 
      EndIf 
    EndIf 
    ProcedureReturn Result
  EndProcedure
  
  Procedure.i Free(*icon)
    FreeMemory(*icon)
  EndProcedure
  
EndModule

Global icon.i

icon = ICON::Create(LoadImage(#PB_Any,"xyz.bmp"));use image plugins to support other image formats!

If icon
  
  Debug ICON::Save(icon,"test123.ico")
  
  ICON::Free(icon)
  
EndIf

End
5mware
Beiträge: 47
Registriert: 14.12.2015 15:16

Re: windows icon-format

Beitrag von 5mware »

sieht gut aus, unterstützt wohl ältere windowssysteme nicht.
relevant für mich wäre eigentlich noch windows2000.

ich meine die png-support besteht erst seit windowsxp.

gibt es irgendeine frei lib mit der das geht?

unter mac kann ich das mittels sips machen, aber ich bräuchte eine vergleichbare lösungsansatz für windows und linux.

ich könnte auch damit leben, wenn ich unter windows von mir aus mit der windows api aus bildern gültige windows icons erstellen könnte. bliebe dann noch eine lösung für linux.

imagemagick ist zwar ein super tool, ist aber zu umfangreich und ich kann das nicht einfach so mit meinem programm später ausliefern. außerdem ist die installation so eine sache. vor allem auf mac oder linux bzw. auf älteren systemversionen. ich will lösungen haben, die einfach zu installieren und zu verwenden sind.
Benutzeravatar
Mijikai
Beiträge: 754
Registriert: 25.09.2016 01:42

Re: windows icon-format

Beitrag von Mijikai »

Bitmaps gehen auch :)

Wikipedia:
An ICO or CUR file is made up of an ICONDIR ("Icon directory") structure, containing an ICONDIRENTRY structure for each image in the file, followed by a contiguous block of all image bitmap data (which may be in either Windows BMP format, excluding the BITMAPFILEHEADER structure, or in PNG format, stored in its entirety).
Also fast gleich wie bei einem PNG nur das hier der Header entfernt werden muss.
5mware
Beiträge: 47
Registriert: 14.12.2015 15:16

Re: windows icon-format

Beitrag von 5mware »

bekomme ich so auch das icon so das es wie üblich die größen 16 24 32 und 48 enthält?

ab xp glaub dann auch die 128px
Antworten