Page 1 sur 3

image to Icone (et pixeliseur)

Publié : dim. 21/août/2016 10:07
par Zorro
j'ai eu besoin de pouvoir utiliser n'importe quelle type d'images
pour en faire une icone valable pour compiler un prg avec EPB

j'ai pas chercher a ré-inventer le roue tout existe deja sur les fourms (et dans mes stocks de codes)

voici un petit code de recup , qui permet de faire une icone a partir d'une image (préalablement reduite a la taille qu'on veux )
Utilisation :
on charge une image (*.bmp ;*.png ;*.tiff,*.jpg )
l'icone sera sauvé au meme endroit que l'image avec le meme nom et l'extension "*.ico"
par defaut la resolution est a 32 mais ça se change ... :roll:

Code : Tout sélectionner

UseJPEGImageDecoder()
UsePNGImageDecoder()
UseTGAImageDecoder()
UseTIFFImageDecoder()

Declare make_ico(file_image.s,resolution)
Declare createicon(image.l)
Declare.i saveicon(hicon, filename$)



file_image.s=OpenFileRequester("ouvrir un image","c:\","*.Bmp;*.jpg;*.png",1)
resolution=32 ; 64 ;128
Make_ico(file_image.s,resolution)


Procedure Make_ico(file_image.s,resolution)
		If file_image.s<>""
				If LoadImage(Image_id,file_image.s)
						ResizeImage(Image_id,resolution,resolution)
						icon_id=CreateIcon(Image.l)
						chemin_image.s=GetPathPart(file_image.s)
						nom_image.s=GetFilePart(file_image.s,#PB_FileSystem_NoExtension)
						nom_icone.s=nom_image.s+"_"+str(resolution)+".ico"
						SaveIcon(icon_id, chemin_image.s+nom_icone.s)
				Endif
		Endif
EndProcedure

Procedure CreateIcon(Image.l)
		;Octavius
		Protected NewIcon.ICONINFO,Mask.l,Icon.l
		Mask=CreateImage(#PB_Any,ImageWidth(Image),ImageHeight(Image),32)
		NewIcon\fIcon=#True
		NewIcon\hbmMask=ImageID(Mask)
		NewIcon\hbmColor=ImageID(Image)
		Icon=CreateIconIndirect_(@NewIcon)
		FreeImage(Mask)
		ProcedureReturn Icon
EndProcedure
Procedure.i SaveIcon(hIcon, filename$)
		;Srod
		Protected result, iconinfo.ICONINFO, hbmMask, hbmColor
		Protected cbitmap.BITMAP, cwidth, cheight, cbitsperpixel, colorcount, colorplanes
		Protected mbitmap.BITMAP, mwidth, mheight, fIcon, xHotspot, yHotspot
		Protected file, imagebytecount, hdc, oldbitmap, mem, bytesinrow, temp
		Protected *bitmapinfo.BITMAPINFO
		;Get information regarding the icon.
		If Not(GetIconInfo_(hIcon, iconinfo)) : ProcedureReturn 0 : EndIf ;Not a valid icon handle.
		fIcon=2-iconinfo\fIcon  ;icon = 1, cursor = 2,
		If fIcon=2  ;Cursor.
				xHotspot=iconinfo\xHotspot
				yHotspot=iconinfo\yHotspot
		EndIf
		;Allocate memory for a BITMAPINFO structure + a color table with 256 entries.
		*bitmapinfo = AllocateMemory(SizeOf(BITMAPINFO) + SizeOf(RGBQUAD)<<8)
		If *bitmapinfo = 0 : ProcedureReturn 0 :EndIf
		;Get the mask (AND) bitmap, which, if the icon is B/W monochrome, contains the colour bitmap.
		hbmMask=iconinfo\hbmMask
		GetObject_(hbmMask, SizeOf(BITMAP),mbitmap)
		mwidth= mbitmap\bmWidth
		mheight= mbitmap\bmHeight
		;Get the colour (XOR) bitmap.
		hbmColor=iconinfo\hbmColor
		If hbmColor
				GetObject_(hbmColor, SizeOf(BITMAP),cbitmap)
				cwidth= cbitmap\bmWidth
				cheight= cbitmap\bmHeight
				cbitsperpixel = cbitmap\bmBitsPixel
				If cbitsperpixel = 0 : cbitsperpixel = 1 : EndIf
				If cbitsperpixel < 8
						colorcount=Pow(2,cbitsperpixel) ;colorcount = 0 if 8 or more bpp.
				EndIf
				colorplanes=cbitmap\bmplanes
		Else ;Monochrome icon.
				cwidth= mwidth
				cheight= mheight/2
				cbitsperpixel = 1
				colorcount=2
				colorplanes=1
				mheight=cheight
		EndIf
		;Ready to start creating the file.
		file=CreateFile(#PB_Any,filename$)
		If file
				;Write the data.
				;word = 0
				WriteWord(file,0)
				;word = 1 for icon, 2 for cursor.
				WriteWord(file,ficon) ;1 for icon, 2 for cursor.
				;word = number of icons in file.
				WriteWord(file,1)  ;***CHANGE IF EXTENDING CODE TO MORE THAN ONE ICON***
				;16 byte ICONDIRENTRY structure, one for each icon.
				WriteByte(file, cwidth)
				WriteByte(file, cheight)
				WriteByte(file, colorcount)
				WriteByte(file, 0) ;Reserved.
				If ficon=1   ;Icon.
						WriteWord(file, colorplanes) ;Should equal 1, -but just in case!
						WriteWord(file, cbitsperpixel)
				Else ;Cursor.
						WriteWord(file, xhotspot)
						WriteWord(file, yhotspot)
				EndIf
				WriteLong(file,0) ;TEMPORARY! WE NEED TO RETURN WHEN WE KNOW THE EXACT QUANTITY.
				; Size of (InfoHeader + ANDbitmap + XORbitmap) 
				WriteLong(file,Loc(file)+4)  ;FilePos, where InfoHeader starts
				;Now the image data in the form BITMAPINFOHEADER (40 bytes) + colour map for the colour bitmap
				;+ bits of colour bitmap + bits of mask bitmap. Gulp! One for each icon.
				;40 byte BITMAPINFOHEADER structure.
				imagebytecount=SizeOf(BITMAPINFOHEADER)
				WriteLong(file, imagebytecount) ;Should be 40.
				WriteLong(file, cwidth)
				WriteLong(file, cheight+mheight) ;Combined heights of colour + mask images.
				WriteWord(file, colorplanes) ;Should equal 1, -but just in case!
				WriteWord(file, cbitsperpixel)
				WriteLong(file, 0) ;Compression.
				WriteLong(file, 0) ;Image size. Valid to set to zero if there's no compression.
				WriteLong(file, 0) ;Unused.
				WriteLong(file, 0) ;Unused.
				WriteLong(file, 0) ;Unused.
				WriteLong(file, 0) ;Unused.
				;Colour map. Only applies for <= 8 bpp.
				hdc=CreateCompatibleDC_(0) ;Needed in order to get the colour table.
				If hbmColor = 0   ;Monochrome icon.
						WriteLong(file, #Black)
						WriteLong(file, #White)
						imagebytecount+SizeOf(rgbquad)*2
				Elseif cbitsperpixel<=8 ;Includes 1 bit non-monochrome icons.
						;Get colour table.
						temp=Pow(2,cbitsperpixel)
						bytesinrow = SizeOf(rgbquad)*temp
						mem=AllocateMemory(bytesinrow)
						oldbitmap=SelectObject_(hdc, hbmColor)
						GetDIBColorTable_(hdc, 0, temp, mem)     
						WriteData(file, mem, bytesinrow) ;Write color table.
						FreeMemory(mem)
						SelectObject_(hdc, oldbitmap)
						imagebytecount+bytesinrow
				Endif
				;Now the colour image bits. We use GetDiBits_() for this.
				bytesinrow = (cwidth*cbitsperpixel+31)/32*4  ;Aligned to a 4-byte boundary.
				bytesinrow * cheight
				mem=AllocateMemory(bytesinrow)
				*bitmapinfo\bmiHeader\biSize=SizeOf(BITMAPINFOHEADER)
				*bitmapinfo\bmiHeader\biWidth=cwidth
				*bitmapinfo\bmiHeader\biPlanes=colorplanes
				*bitmapinfo\bmiHeader\biBitCount=cbitsperpixel
				If hbmColor
						*bitmapinfo\bmiHeader\biHeight=cheight
						GetDIBits_(hdc,hbmColor,0,cheight,mem,*bitmapinfo,#DIB_RGB_COLORS)
				Else ;Monochrome color image is the bottom half of the mask image.
						*bitmapinfo\bmiHeader\biHeight=2*cheight
						GetDIBits_(hdc,hbmMask,0,cheight,mem,*bitmapinfo,#DIB_RGB_COLORS)
				Endif
				WriteData(file, mem, bytesinrow)
				FreeMemory(mem)
				imagebytecount+bytesinrow
				;Now the mask image bits. We use GetDiBits_() for this.
				bytesinrow = (mwidth+31)/32*4  ;Aligned to a 4-byte boundary.
				bytesinrow * mheight
				mem=AllocateMemory(bytesinrow)
				*bitmapinfo\bmiHeader\biWidth=mwidth
				*bitmapinfo\bmiHeader\biPlanes=1
				*bitmapinfo\bmiHeader\biBitCount=1
				If hbmColor
						*bitmapinfo\bmiHeader\biHeight=mheight
						GetDIBits_(hdc,hbmMask,0,mheight,mem,*bitmapinfo,#DIB_RGB_COLORS)
				Else
						*bitmapinfo\bmiHeader\biHeight=2*mheight
						GetDIBits_(hdc,hbmMask,mheight,mheight,mem,*bitmapinfo,#DIB_RGB_COLORS)
				EndIf
				WriteData(file, mem, bytesinrow)
				FreeMemory(mem)
				imagebytecount+bytesinrow
				DeleteDC_(hdc)
				;Finally, return to the field we missed out.
				FileSeek(file, 14)
				WriteLong(file, imagebytecount)
		CloseFile(file)
		result= 1 ;Signal everything is fine.
		Else ;>
		result= 0 
		EndIf;>
		DeleteObject_(hbmMask) ;These are copies created as a result of GetIconInfo_() and so require deleting.
		DeleteObject_(hbmColor)
		FreeMemory(*bitmapinfo)
		ProcedureReturn result
EndProcedure


Re: image to Icone

Publié : dim. 21/août/2016 11:30
par Shadow
Sympa ce code, merci :)

Re: image to Icone

Publié : dim. 21/août/2016 17:09
par JohnJohnsonSHERMAN
Intéressant en effet... Y' plus qu'a se bricoler un éditeur d'icones 8)

Re: image to Icone

Publié : dim. 21/août/2016 17:40
par Micoute
Je plussoie.

Re: image to Icone

Publié : dim. 21/août/2016 21:19
par Bernie
zorro c'est le roi du code en PB :D

Re: image to Icone

Publié : dim. 21/août/2016 21:40
par Zorro
:roll:

Re: image to Icone

Publié : jeu. 13/oct./2016 22:25
par omega
Excellent ! Merci beaucoup pour le partage.

Re: image to Icone

Publié : ven. 14/oct./2016 7:15
par Kwai chang caine
Je n'ai pas pu tester ce code, étant actuellement sur smartphone.
Mais un truc qui m'a toujours surpris, c'est la qualité de certains icônes professionnels ou non, que je ne suis jamais réellement arrivé à reproduire.
J'utilise en attendant de trouver mieux photofiltre qui permet un export en icones
Peur être faut il acheter un logiciel réputé dans ce travail, pour obtenir cette précision.

Je testerais ce code dès que possible, en attendant, merci pour le partage 8)

Re: image to Icone

Publié : ven. 14/oct./2016 9:25
par MLD
Cool :D :wink:

Re: image to Icone

Publié : ven. 14/oct./2016 10:01
par Ar-S
@KCC
Tu veux dire pour créer le dessin de base ?
Pour la conversion en ico j'utilise Toycon. Tout petit et portable, permet d'exporter en multiples icones (16+32+6 etc...) par drag n drop.

@Dobro.
Saurais tu d'ailleurs comment créer un pack contenant les différentes tailles dans un fichier ?

Re: image to Icone

Publié : ven. 14/oct./2016 12:11
par Zorro
Ar-S a écrit :@Dobro.
Saurais tu d'ailleurs comment créer un pack contenant les différentes tailles dans un fichier ?
il me semble que Denis, avait donné un code dans ce sens ...

faut que je fouille mes archives :)

ps: Falsam aussi avait publié la dessus il me semble

Re: image to Icone

Publié : ven. 14/oct./2016 21:20
par Zorro
Ar-S a écrit : @Dobro.
Saurais tu d'ailleurs comment créer un pack contenant les différentes tailles dans un fichier ?
ici Netmaestro a fait un code qui permet de sauver plusieurs image dans un fichier *.ico

http://forums.purebasic.com/english/vie ... 4fe4454ea4

Re: image to Icone

Publié : ven. 14/oct./2016 23:27
par Ar-S
Merci pour le lien.

Re: image to Icone

Publié : sam. 15/oct./2016 7:55
par Kwai chang caine
Ar-S a écrit :@KCC
Tu veux dire pour créer le dessin de base ?
Pour la conversion en ico j'utilise toyicon. Tout petit et portable, permet d'exporter en multiples icones (16+32+6 etc...) par drag n drop.
Bah en fait, je ne sais pas vraiment d'où vient le problème.
Depuis 10 ans que je fais des icones, ils sont pas vilain, mais je trouve que ceux des logiciels pro, sont plus net, plus parfait, sans parler qu'ils paraissent 3d parfois.
Le pire c'est les textes, pour lire quelques caracteres dessiné dans l' icone, faut que ce soit drôlement net.

J'ai essayé à l'époque plusieurs freeware, et de changer le format de départ, de l'icône, etc...
Et bof, je suis pas en admiration devant les miens.

Faut dire que bien souvent je pars d'une image, pas d'un dessin.
C'est peut être la raison, sur une image, les contours sont moins précis, et les caractères moins nets

Merci pour le lien 8)

Re: image to Icone

Publié : sam. 15/oct./2016 9:44
par Zorro
Kwai chang caine a écrit : Faut dire que bien souvent je pars d'une image, pas d'un dessin.
C'est peut être la raison, sur une image, les contours sont moins précis, et les caractères moins nets

Merci pour le lien 8)
si tu part d'une image jpg , tu va avoir une imprecision liée a la compression jpg
mais si tu part d'une image Png ou bmp , aucun problemes !

ensuite l’imprécision peut éventuellement venir de l'algo de réduction du format de l'image
je dirai meme que cette imprecision s'ajoute au probleme de compression de l'image
tu prends une image jpg ,donc deja degradé , tu la reduit, ça ajoute une degradation puisque perte de pixel

toutefois, si tu part d'une image bmp , donc sans degradation , que tu la reduis, ton image va perdre en qualité
mais beaucoup moins !

c'est sur, qu'une icone dessiné directement a la main par un editeur d'icone ,sera bien plus precise
puisque le dessin aura été dessiné, et conçut dans et pour la bonne résolution, c'est le jour et la nuit
mais pour ça mieux vaut etre un artiste du pixel-Art , qui est un art a part entiere :)

de memoire, il y avait un magazine Atari (Atari Mag ? ) qui avait fait une serie d'articles d'apprentissage du Pixel-Art

vais essayer de te retrouver ça .... :)


[reedit]
recherche infructueuse !
j'ai balancé tout mes vieux magasine, et je ne me rappel pas du nom de celui qui avait les articles
qui donnait des cours de pixel-art , dommage, car c'etait vachement bien fait