Dazu kann ich zu schlecht Englisch!ts-soft hat geschrieben:Vielleicht im engl. Forum suchen? Dort gibts auf jedenfall ein paar Infos.

Warum sucht ihr nicht?, ihr habt in den meisten fällen ne "Flache Ratte" und ich nicht!
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!Dazu kann ich zu schlecht Englisch!
LOL!Warum sucht ihr nicht?
Ich hab ne' Weile gebraucht um diesen (schlechten..ihr habt in den meisten fällen ne "Flache Ratte" und ich nicht!
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.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).
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
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
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