Icon erstellen

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Thomas
Beiträge: 893
Registriert: 06.07.2006 19:24
Wohnort: Regensburg
Kontaktdaten:

Beitrag von Thomas »

ts-soft hat geschrieben:Vielleicht im engl. Forum suchen? Dort gibts auf jedenfall ein paar Infos.
Dazu kann ich zu schlecht Englisch! :cry:
Warum sucht ihr nicht?, ihr habt in den meisten fällen ne "Flache Ratte" und ich nicht!
v6.00
Benutzeravatar
Fluid Byte
Beiträge: 3110
Registriert: 27.09.2006 22:06
Wohnort: Berlin, Mitte

Beitrag von Fluid Byte »

Dazu kann ich zu schlecht Englisch!
Du weisst schon das von fast alle Programmiersprachen wie HTML, C++ oder PB eine englische Syntax haben? Du musst es sowie lernen. Je eher desto bester!
Warum sucht ihr nicht?
LOL! :lol:

Ganz sicher nicht, da musst du dich schon selber bemühen.
..ihr habt in den meisten fällen ne "Flache Ratte" und ich nicht!
Ich hab ne' Weile gebraucht um diesen (schlechten :twisted:) Wortwitz zu verstehen. Ist aber auch "Titte" weil das keine Entschuldiung ist. Selbst ein 28k Modem reicht aus wenn du dir nur textbasierte Seiten anguckst.
Benutzeravatar
#NULL
Beiträge: 2238
Registriert: 20.04.2006 09:50

Beitrag von #NULL »

@TO
weder der titel noch deine bisherigen posts sagen wirklich, was du willst.
wenn es dir einfach um eine bmp>ico-kovertierung geht, da gibt's zich tools, ..und mit Kaeru's tip bist du schon da wo du hinwillst. wenn du nur was kleines willst.. ..da gibt es auch kleines. ich glaube sogar schonmal im forum ein PB-xxx>ico-konverter gesehen zu haben ((falko?)). wenn es dir um die programmierung geht, weil es dir spaß macht, dann verstehe ich nicht, warum du nicht auch spaß daran hast, nach informationen zu suchen. und wenn du schon direkt nach aufbau des datei-formats fragt, dann kommst du sowieso nicht drumherum dich damit intensiv auseinander zu setzen. und wenn du dann sachen findest die für dich zu kompliziert sind, dann denke nicht, dass die leute es einfach aus unfähigkeit kompliziert erklären und man das auch in zwei drei zeilen coden könnte. (ob es in dem fall (icons ect.) einfach ist ,weiß ich nicht)

ist denn hier nix dabei?
http://www.purebasic.fr/german/viewtopi ... +erstellen
my pb stuff..
Bild..jedenfalls war das mal so.
Benutzeravatar
Thomas
Beiträge: 893
Registriert: 06.07.2006 19:24
Wohnort: Regensburg
Kontaktdaten:

Beitrag von Thomas »

Muss ich mir erst noch genauer ansehen, aber fürs erste DANKE!
v6.00
Benutzeravatar
hardfalcon
Beiträge: 3447
Registriert: 29.08.2004 20:46

Beitrag von hardfalcon »

ZeHa hat geschrieben:Zudem kann ein einziges Icon auch intern zwei Icons beinhalten, eins mit 32x32 und eins mit 16x16 (ist oft der Fall, wenn das 32x32-Icon in klein nicht so toll aussehen würde).
Dass das auch mit einer einzigen ICO-Datei geht, ist mir neu. Ich dachte immer, bei Programmen/DLLs würden einfach mehrere verschiedene ICO-Dateien mit in die fertige Datei (bzw. in deren REssourcenteil) gelinkt werden.
Benutzeravatar
Thomas
Beiträge: 893
Registriert: 06.07.2006 19:24
Wohnort: Regensburg
Kontaktdaten:

Beitrag von Thomas »

Hi,
hab mal versucht nen IconCreator zu basteln, müsste normalerweise im Großen und Ganzen gehen, tut er aber nicht; hab irgendwo den Wurm drin.
Kann mir jemand helfen?
Wenn man das Icon erstellt, sieht das so komisch aus!

Code: Alles auswählen

;#####################
;#                   #
;#  IconCreator XXL  #
;#                   #
;#####################


;*****-Fenster-*****
Enumeration
  #HauptFenster
EndEnumeration

;*****-Bilder-*****
Enumeration
  #AuswahlImage
  #OrginalBitmap
  #Bitmap
  #Icon
EndEnumeration

;*****-Gadgets-*****
Enumeration
  #Frame3DGroesse
  #Frame3DTransparent
  #Frame3DVorschau
  #TextColorTransparent
  #TextChooseColorTransparent
  #Option16
  #Option24
  #Option32
  #Option48
  #CheckTransparent
  #ColorTransparent
  #ChooseColorTransparent
  #ImageBitmap
  #ButtonSpeichern
  #ButtonAbbrechen
EndEnumeration

;*****-Name der Andwendung-*****
#AndwendungName = "IconCreator XXL"

;*****-Varialben, Strings-*****
Global Bitmap$
Global SaveIcon$


;*****-Icon erstellen-*****
Procedure CreateIcon()

  If GetGadgetState(#Option16) <> 0
    Restore IconHeader_16
  ElseIf GetGadgetState(#Option24) <> 0
    Restore IconHeader_24
  ElseIf GetGadgetState(#Option32) <> 0
    Restore IconHeader_32
  ElseIf GetGadgetState(#Option48) <> 0
    Restore IconHeader_48
  EndIf

  CreateFile(#Icon, SaveIcon$ + ".ico")
    For n = 1 To 62
      Read ThisValue
      WriteData(#Icon, @ThisValue, 1)
    Next n

    For ny = 31 To 0 Step -1
      For nx = 0 To 31 Step 1
        If StartDrawing(ImageOutput(#Bitmap))
            Color = Point(nx, ny)
            WriteByte(#Icon, Red(Color))
            WriteByte(#Icon, Green(Color))
            WriteByte(#Icon, Blue(Color))
          StopDrawing()
        EndIf
      Next nx
    Next ny
    For nm = 1 To 128                                    ;<<<<<---- Hier weiß ich irgendwie nicht für was das gut sein soll. (Habs in anderen Codes abgeguckt)
      WriteByte(#Icon, 0)
    Next nm
    
  CloseFile(#Icon)

EndProcedure

;*****-Bitmap öffnen-*****
Bitmap$ = OpenFileRequester("Bitmap öffnen", "", "Bitmap | *.bmp", 0)
If Bitmap$ <> ""
  LoadImage(#OrginalBitmap, Bitmap$)
  CopyImage(#OrginalBitmap, #Bitmap)
  ResizeImage(#Bitmap, 32, 32)
Else
  MessageRequester("Fehler", "Bitmap konnte nicht geladen werden!", #MB_ICONERROR)
  End
EndIf


;*****-Hauptfenster öffnen-*****
If OpenWindow(#HauptFenster, 0, 0, 330, 290, #AndwendungName, #PB_Window_ScreenCentered | #PB_Window_SystemMenu)

  ;*****-Gadgetliste-*****
  If CreateGadgetList(WindowID(#HauptFenster))
    Frame3DGadget(#Frame3DGroesse, 10, 10,  140, 129, "Größe")
      OptionGadget(#Option16, 20, 30,  65,  24, "16 x 16")
      OptionGadget(#Option24, 20, 55,  65,  24, "24 x 24")
      OptionGadget(#Option32, 20, 80,  65,  24, "32 x 32")
      OptionGadget(#Option48, 20, 105, 65,  24, "48 x 48")
      SetGadgetState(#Option32, 1)

    Frame3DGadget(#Frame3DTransparent, 10, 150, 140, 129, "Transparents")
      CheckBoxGadget(#CheckTransparent, 20, 170, 120, 24, "Transparentes Icon")
      ContainerGadget(#ColorTransparent, 20, 205, 20, 20, #PB_Container_Raised)
        SetGadgetColor(#ColorTransparent, #PB_Gadget_BackColor, RGB(255, 255, 255))
      CloseGadgetList()
      TextGadget(#TextColorTransparent, 50, 200, 70, 30, "Transparente Farbe")
      ButtonGadget(#ChooseColorTransparent, 20, 240, 20, 20, "")
      TextGadget(#TextChooseColorTransparent, 50, 235, 70, 30, "Transparente Farbe wählen")

    Frame3DGadget(#Frame3DVorschau, 170, 10, 150, 180, "Vorschau")
      ImageGadget(#ImageBitmap, 190, 40, 0, 0, ImageID(#Bitmap), #PB_Image_Border)

    ButtonGadget(#ButtonSpeichern, 180, 209, 130, 30, "Als Icon speichern")
    ButtonGadget(#ButtonAbbrechen, 180, 249, 130, 30, "Abbrechen")
  EndIf

  ;*****-Hauptschleife-*****
  Repeat

    EventID = WaitWindowEvent()

    ;*****-Gadgetabfrage-*****
    If EventID = #PB_Event_Gadget
      Select EventGadget()
        Case #Option16
          FreeImage(#Bitmap)
          CopyImage(#OrginalBitmap, #Bitmap)
          ResizeImage(#Bitmap, 16, 16)
          FreeGadget(#ImageBitmap)
          ImageGadget(#ImageBitmap, 190, 40, 0, 0, ImageID(#Bitmap), #PB_Image_Border)
        Case #Option24
          FreeImage(#Bitmap)
          CopyImage(#OrginalBitmap, #Bitmap)
          ResizeImage(#Bitmap, 24, 24)
          FreeGadget(#ImageBitmap)
          ImageGadget(#ImageBitmap, 190, 40, 0, 0, ImageID(#Bitmap), #PB_Image_Border)
        Case #Option32
          FreeImage(#Bitmap)
          CopyImage(#OrginalBitmap, #Bitmap)
          ResizeImage(#Bitmap, 32, 32)
          FreeGadget(#ImageBitmap)
          ImageGadget(#ImageBitmap, 190, 40, 0, 0, ImageID(#Bitmap), #PB_Image_Border)
        Case #Option48
          FreeImage(#Bitmap)
          CopyImage(#OrginalBitmap, #Bitmap)
          ResizeImage(#Bitmap, 48, 48)
          FreeGadget(#ImageBitmap)
          ImageGadget(#ImageBitmap, 190, 40, 0, 0, ImageID(#Bitmap), #PB_Image_Border)
        Case #ButtonSpeichern
          SaveIcon$ = SaveFileRequester("Icon Speichern als...", "", "Icon | *.ico", 0)
          CreateIcon()
        Case #ButtonAbbrechen
          EventID = 16
      EndSelect
    EndIf

    If GetGadgetState(#CheckTransparent) = 1
      DisableGadget(#ChooseColorTransparent, 0)
      DisableGadget(#TextChooseColorTransparent, 0)
      DisableGadget(#TextColorTransparent, 0)
    Else
      DisableGadget(#ChooseColorTransparent, 1)
      DisableGadget(#TextChooseColorTransparent, 1)
      DisableGadget(#TextColorTransparent, 1)
    EndIf

  Until EventID = #PB_Event_CloseWindow

Else
  MessageRequester("Fehler", "Fenster konnte nicht geöffnet werden!", #MB_ICONERROR)
  End
EndIf

End

;*****-Iconformate-*****
DataSection
  IconHeader_16:
    Data.l $00, $00, $01, $00, $01, $00, $10, $10, $00, $00, $01, $00, $08, $00, $68, $05 
    Data.l $00, $00, $16, $00, $00, $00, $28, $00, $00, $00, $10, $00, $00, $00, $20, $00
    Data.l $00, $00, $01, $00, $08, $00, $00, $00, $00, $00, $00, $01, $00, $00, $00, $00
    Data.l $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
  IconHeader_24:
    Data.l $00, $00, $01, $00, $01, $00, $18, $18, $00, $00, $01, $00, $08, $00, $FF, $06
    Data.l $00, $00, $16, $00, $00, $00, $28, $00, $00, $00, $18, $00, $00, $00, $30, $00
    Data.l $00, $00, $01, $00, $08, $00, $00, $00, $00, $00, $40, $02, $00, $00, $00, $00
    Data.l $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
  IconHeader_32:
    Data.l $00, $00, $01, $00, $01, $00, $20, $20, $00, $00, $01, $00, $08, $00, $FF, $08
    Data.l $00, $00, $16, $00, $00, $00, $28, $00, $00, $00, $20, $00, $00, $00, $40, $00
    Data.l $00, $00, $01, $00, $08, $00, $00, $00, $00, $00, $00, $04, $00, $00, $00, $00
    Data.l $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
  IconHeader_48:
    Data.l $00, $00, $01, $00, $01, $00, $30, $30, $00, $00, $01, $00, $08, $00, $FF, $0E
    Data.l $00, $00, $16, $00, $00, $00, $28, $00, $00, $00, $30, $00, $00, $00, $60, $00
    Data.l $00, $00, $01, $00, $08, $00, $00, $00, $00, $00, $00, $09, $00, $00, $00, $00
    Data.l $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
EndDataSection 
(Das mit dem transparenten Icon hab ich noch gar nicht angefangen)
v6.00
Benutzeravatar
Thomas
Beiträge: 893
Registriert: 06.07.2006 19:24
Wohnort: Regensburg
Kontaktdaten:

Beitrag von Thomas »

Kann mir keiner helfen? :cry:
v6.00
Benutzeravatar
Scarabol
Beiträge: 1427
Registriert: 30.11.2005 21:00

Beitrag von Scarabol »

Hallo,

ich habe deinen Code mit einem anderen Code (der funktioniert) verglichen und konnte durch kopieren und ersetzten in deinem Code einige Fehler ausmachen:

1. Die Header die du verwendest scheinen falsch zu sein, da sie es nicht mal in meinem funktionierenden Code tun.
Mein Header für 32*32 Icons mit 256 Farben:

Code: Alles auswählen

    IconHeader_32:
Header mit 256 Farben aus einem anderen Code ersetzt
      Data.l $00, $00, $01, $00, $01, $00, $20, $20, $00, $00, $00, $00, $00, $00, $A8, $08 
      Data.l $00, $00, $16, $00, $00, $00, $28, $00, $00, $00, $20, $00, $00, $00, $40, $00 
      Data.l $00, $00, $01, $00, $08, $00, $00, $00, $00, $00, $80, $04, $00, $00, $00, $00 
      Data.l $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 
Wo hast du deine Header her?

2. Du muss die Icon Datei wie folgt aufbauen
- Header
- Palette mit allen Farben des Icons
- die eigentlichen Bildfarben
- Transparente Farben <- muss drin sein sonst gibts nen Error

Hoffe das Hilft dir weiter ansonsten kannst du ja folgenden Code verwenden und deine gut gelungene Benutzeroberfläche damit verknüpfen. Der Code war nicht von mir, hab ihn nur ein wenig verändert, also nicht über die unübersichtlichkeit schimpfen.

Code: Alles auswählen

Global Transparent 
Transparent = 0

Procedure.s GetFileName(FileName$)
  File$ = FileName$
  File$ = Left(File$, Len(File$)-Len(GetExtensionPart(File$))-1)
  ProcedureReturn File$
EndProcedure

Procedure.l WriteByte2(File,val.l)
  WriteData(File,@val,1) 
EndProcedure 

Procedure.l SaveIcon(FileName.s,TransparentColor.l) 
  
  #File = 0
  
  ;Öffnet die Datei
  If CreateFile(#File, FileName)=0
    ProcedureReturn 0
  EndIf
  
  ;Schreibt zuerst den HEADER für eine 32x32 Pixel große ICO-Datei
  Restore IconHeader_32
  For i=1 To 62
    Read ThisValue
    WriteByte(#File, ThisValue)
  Next i
  
  ;Erstellt eine Palette mit 256 Farben
  Dim UsedColors.l(255)
  UsedColors(0) = RGB(0,0,0)
  UsedColorCount.l = 1
  For y=31 To 0 Step -1
    For x=0 To 31 Step 1
      Farbe.l = Point(x,y)
      AddToList.l = 1
      For i=0 To UsedColorCount
        If Farbe = UsedColors(i)
          AddToList = 0
          i = UsedColorCount
        EndIf
      Next i
      If UsedColorCount=255 And AddToList
        MIN_I = 1
        MIN_DIF = 0
        For i=1 To UsedColorCount
          If Abs(Farbe-UsedColors(i)) < MIN_DIF Or i = 1
            MIN_I = i
            MIN_DIF = Abs(Farbe-UsedColors(i))
          EndIf
        Next i
        NEW_RED = (Red(Farbe)+Red(UsedColors(MIN_I)))/2
        NEW_GREEN = (Green(Farbe)+Green(UsedColors(MIN_I)))/2
        NEW_BLUE = (Blue(Farbe)+Blue(UsedColors(MIN_I)))/2
        UsedColors(MIN_I) = RGB(NEW_RED,NEW_GREEN,NEW_BLUE)
      ElseIf UsedColorCount <> 255 And AddToList
        UsedColors(UsedColorCount) = Farbe
        UsedColorCount+1
      EndIf
    Next x
  Next y
  
  ;Schreibt die Palette in die Datei
  For i=0 To UsedColorCount
    WriteByte(#File,Blue(UsedColors(i)))
    WriteByte(#File,Green(UsedColors(i)))
    WriteByte(#File,Red(UsedColors(i)))
    WriteByte(#File,0)
  Next i
  
  ;Für alle freien Einträge wird die Farbe SCHWARZ eingefügt
  For i = UsedColorCount+1 To 255
    WriteLong(#File,0)
  Next i
  
  ;Schreibt das Bild in die Datei
  For y=31 To 0 Step -1
    For x=0 To 31 Step 1
      Farbe.l = Point(x,y)
      If Farbe <> TransparentColor
        MIN_I = 0
        For i=0 To UsedColorCount
          If Abs(Farbe-UsedColors(i)) < MIN_DIF Or i = 0
            MIN_I = i
            MIN_DIF = Abs(Farbe-UsedColors(i))
          EndIf
        Next i
        Farbe = MIN_I
      Else
        Farbe = 0
      EndIf
      WriteByte(#File, Farbe)
    Next x
  Next y
  
  ;Schreibt am Ende eine Liste, damit der Computer weiß, welche Pixel transparent sind
  For y=31 To 0 Step -1
    For x=0 To 31 Step 8
      LastByte.l = 0
      For i=0 To 7
        Farbe.l = Point(X+I,Y)
        If Farbe = TransparentColor
          Select i
            Case 7 : OrVal=  1
            Case 6 : OrVal=  2
            Case 5 : OrVal=  4
            Case 4 : OrVal=  8
            Case 3 : OrVal= 16
            Case 2 : OrVal= 32
            Case 1 : OrVal= 64
            Case 0 : OrVal=128
          EndSelect
          LastByte|OrVal
        EndIf
      Next i
      WriteByte(#File, LastByte)
    Next x
  Next y
  
  ;Fertig! Schließt die Datei
  CloseFile(#File)
  ProcedureReturn 1
  
  ;Die HEADER für eine ICO-Dateien
  DataSection 

    IconHeader_32:     ;<--- Diesen Header hab ich durch einen 32*32 Header mit 256 Farben aus einem anderen Code ersetzt
      Data.l $00, $00, $01, $00, $01, $00, $20, $20, $00, $00, $00, $00, $00, $00, $A8, $08 
      Data.l $00, $00, $16, $00, $00, $00, $28, $00, $00, $00, $20, $00, $00, $00, $40, $00 
      Data.l $00, $00, $01, $00, $08, $00, $00, $00, $00, $00, $80, $04, $00, $00, $00, $00 
      Data.l $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 
  EndDataSection 

EndProcedure 

UsePNGImageDecoder()
UseJPEGImageDecoder()
UseTIFFImageDecoder()

Image$ = OpenFileRequester("Bild wählen...", "J:\Icons\", "Alle unterstützten Bidlformate (*.*)|*.bmp;*.png;*.jpg;*jpeg", 0)

If Image$
  LoadImage(2, Image$)
  If IsImage(2)
    StartDrawing(ImageOutput(2))
      SaveIcon(GetFileName(Image$)+".ico", RGB(255,255,255))
    StopDrawing()
    FreeImage(2)
  Else
    MessageRequester("Error", "Das Bild "+Image$+" konnte nicht geladen werden!", #MB_ICONERROR)
    End
  EndIf
EndIf
End
Hoffe ich konnte dir helfen und mach weiter so
Scarabol
Abgeschlossen Projekte:
Schreibmaschine, Bildschirmlupe, Wings3DtoOgreMeshConverter
Watch: PureArea

PB-V: 4
WinXP
Benutzeravatar
Thomas
Beiträge: 893
Registriert: 06.07.2006 19:24
Wohnort: Regensburg
Kontaktdaten:

Beitrag von Thomas »

Ok, danke erstmal...

Wo ich den Header her hab?, den hab ich aus der PureBasic-Lounge.

Gibts eigentlich auch in den anderen Headern für die 16x16-, 24x24-, und 48x48erIcons?
v6.00
Antworten