Seite 2 von 3

Verfasst: 15.12.2006 16:18
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!

Verfasst: 15.12.2006 17:50
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.

Verfasst: 15.12.2006 19:09
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

Verfasst: 15.12.2006 22:29
von Thomas
Muss ich mir erst noch genauer ansehen, aber fürs erste DANKE!

Verfasst: 16.12.2006 02:22
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.

Verfasst: 16.12.2006 07:46
von #NULL

Verfasst: 16.12.2006 21:56
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)

Verfasst: 18.12.2006 14:42
von Thomas
Kann mir keiner helfen? :cry:

Verfasst: 21.12.2006 17:06
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

Verfasst: 21.12.2006 17:18
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?