Page 2 of 2

Re: free ways to turn .png or .bmp into .ico?

Posted: Sun Nov 30, 2014 2:54 pm
by IdeasVacuum
I'm using 256 x 256 for Win7/8.

There are a couple of commercial apps that are really good:
Real World Icon Editor
Icon Cool Studio

Re: free ways to turn .png or .bmp into .ico?

Posted: Sun Nov 30, 2014 7:54 pm
by bembulak
Inkscape for design and Gimp for saving/converting to .ico!

Re: free ways to turn .png or .bmp into .ico?

Posted: Sun Nov 30, 2014 10:36 pm
by STARGĂ…TE
Here is my updated module to create icons with multiple layer from a collection of PB images:

Code: Select all

DeclareModule Icon
	
	Enumeration
		#Icon_Icon   = 1
		#Icon_Cursor = 2
	EndEnumeration
	
	Declare.i IconID(Icon.i)
	Declare.i IsIcon(Icon.i)
	Declare.i FreeIcon(Icon.i)
	Declare.i CreateIcon(Icon.i)
	Declare AddIconImage(Icon.i, Image.i)
	Declare IconImage(Icon.i, Size.i)
	Declare IconImageID(Icon.i, Size.i)
	Declare SaveIcon(Icon.i, FileName.s, Format.i=#Icon_Icon, HotSpotX.i=0, HotSpotY.i=0)
	
EndDeclareModule



Module Icon



#IndexNumber  = $FFFF
#AnyNumber    = ~#IndexNumber

Structure IconLayer
	Image.i
	FileOffset.i
EndStructure

Structure Icon
	Number.i
	List Layer.IconLayer()
EndStructure

Structure IconInclude
	List		Icon.Icon()
	Array		*IconID.Icon(0)
EndStructure



Global IconInclude.IconInclude



Procedure.i IconID(Icon.i)
	
	If Icon & #AnyNumber
		ProcedureReturn Icon
	Else
		ProcedureReturn IconInclude\IconID(Icon)
	EndIf
	
EndProcedure



Procedure.i IsIcon(Icon.i)
	
	ForEach IconInclude\Icon()
		If IconInclude\Icon()\Number = Icon
			ProcedureReturn @IconInclude\Icon()
		EndIf
	Next
	
EndProcedure



Procedure.i FreeIcon(Icon.i)
	
	Protected *Icon.Icon = IconID(Icon)
	
	With *Icon
		
		ForEach \Layer()
			FreeImage(\Layer()\Image)
		Next
		
		If Not \Number & #AnyNumber
			IconInclude\IconID(\Number) = #Null
		EndIf
		
		ChangeCurrentElement(IconInclude\Icon(), *Icon)
		DeleteElement(IconInclude\Icon())
		
	EndWith
	
EndProcedure



Procedure.i CreateIcon(Icon.i)
	
	Protected *Icon.Icon
	
	If Icon = #PB_Any
		*Icon = AddElement(IconInclude\Icon())
		*Icon\Number = *Icon
	ElseIf Not Icon & #AnyNumber
		*Icon = AddElement(IconInclude\Icon())
		*Icon\Number = Icon
		If ArraySize(IconInclude\IconID()) < Icon 
			ReDim IconInclude\IconID(Icon)
		ElseIf IconInclude\IconID(Icon)
			FreeIcon(IconInclude\IconID(Icon))
		EndIf
		IconInclude\IconID(Icon) = *Icon
	Else
		ProcedureReturn #Null
	EndIf
	
	ProcedureReturn *Icon
	
EndProcedure



Procedure AddIconImage(Icon.i, Image.i)
	
	Protected *Icon.Icon = IconID(Icon)
	
	AddElement(*Icon\Layer())
	*Icon\Layer()\Image  = CopyImage(Image, #PB_Any)
	
EndProcedure



Procedure IconImage(Icon.i, Size.i)
	
	Protected *Icon.Icon = IconID(Icon)
	
	ForEach *Icon\Layer()
		If ImageWidth(*Icon\Layer()\Image) = Size
			ProcedureReturn *Icon\Layer()\Image
		EndIf
	Next
	
EndProcedure



Procedure IconImageID(Icon.i, Size.i)
	
	ProcedureReturn ImageID(IconImage(Icon, Size))
	
EndProcedure



Procedure Icon_WriteImage(File.i, Image.i)
	
	Protected Color
	Protected BitmapInfoHeader.BITMAPINFOHEADER
	
	With BitmapInfoHeader
		\biSize     = SizeOf(BITMAPINFOHEADER)
		\biWidth    = ImageWidth(Image)
		\biHeight   = ImageHeight(Image)*2
		\biPlanes   = 1
		\biBitCount = 32
	EndWith
	WriteData(File, BitmapInfoHeader, SizeOf(BitmapInfoHeader))
	If StartDrawing(ImageOutput(Image))
		DrawingMode(#PB_2DDrawing_AllChannels)
		For Y = ImageHeight(Image)-1 To 0 Step -1
			For X = 0 To ImageWidth(Image)-1
				Color = Point(X, Y)
				WriteLong(File, Color&$FF00FF00|((Color&$FF)<<16)|((Color>>16)&$FF))
			Next
		Next
		StopDrawing()
	EndIf
	
EndProcedure



Procedure SaveIcon(Icon.i, FileName.s, Format.i=#Icon_Icon, HotSpotX.i=0, HotSpotY.i=0)
	
	Protected *Icon.Icon = IconID(Icon)
	Protected File.i = CreateFile(#PB_Any, FileName)
	Protected *Buffer
	
	With *Icon
		If File
			WriteWord(File, 0) ; Reserved
			WriteWord(File, Format) ; Image type
			WriteWord(File, ListSize(\Layer())) ; Number of images
			; Layer List
			ForEach \Layer()
				WriteAsciiCharacter(File, ImageWidth(\Layer()\Image)) ; Width
				WriteAsciiCharacter(File, ImageHeight(\Layer()\Image)) ; Height
				WriteAsciiCharacter(File, 0) ; Colors
				WriteAsciiCharacter(File, 0) ; Reserved
				If Format = #Icon_Cursor
					WriteWord(File, HotSpotX) ; Color planes
					WriteWord(File, HotSpotY) ; Bits per pixel
				Else
					WriteWord(File, 1) ; Color planes
					WriteWord(File, 32) ; Bits per pixel
				EndIf
				WriteLong(File, SizeOf(BITMAPINFOHEADER)+ImageWidth(\Layer()\Image)*ImageHeight(\Layer()\Image)*4)
				\Layer()\FileOffset = Loc(File)
				WriteLong(File, 0)
			Next
			; Datas
			ForEach \Layer()
				FileSeek(File, \Layer()\FileOffset)
				WriteLong(File, Lof(File))
				FileSeek(File, Lof(File))
				Icon_WriteImage(File, \Layer()\Image)
			Next
			CloseFile(File)
		EndIf
	EndWith
	
EndProcedure



EndModule



CompilerIf #PB_Compiler_IsMainFile
	
	UseModule Icon
	
	Enumeration
		#Icon
	EndEnumeration
	
	UsePNGImageDecoder()
	
	If CreateIcon(#Icon)
		AddIconImage(#Icon, LoadImage(#PB_Any, "dvd16.png")) ; use your own path!
		AddIconImage(#Icon, LoadImage(#PB_Any, "dvd32.png")) ; use your own path!
		SaveIcon(#Icon, "dvd.ico")
	EndIf
	
CompilerEndIf

Re: free ways to turn .png or .bmp into .ico?

Posted: Sun Nov 30, 2014 10:51 pm
by IdeasVacuum
You can draw excellent icons with the free version of Serif DrawPlus:
DrawPlus