image to Icone (et pixeliseur)

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Avatar de l’utilisateur
Zorro
Messages : 2185
Inscription : mar. 31/mai/2016 9:06

image to Icone (et pixeliseur)

Message 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

Dernière modification par Zorro le sam. 15/oct./2016 17:32, modifié 2 fois.
Image
Image
Site: http://michel.dobro.free.fr/
Devise :"dis moi ce dont tu as besoin, je t'expliquerai comment t'en passer"
Shadow
Messages : 1373
Inscription : mer. 04/nov./2015 17:39

Re: image to Icone

Message par Shadow »

Sympa ce code, merci :)
Processeur: Intel Core I7-4790 - 4 Cœurs - 8 Thread: 3.60 Ghz.
Ram: 32 GB.
Disque: C: SDD 250 GB, D: 3 TB.
Vidéo: NVIDIA GeForce GTX 960: 2 GB DDR5.
Écran: Asus VX248 24 Pouces: 1920 x 1080.
Système: Windows 7 64 Bits.

PureBasic: 5.60 x64 Bits.
Avatar de l’utilisateur
JohnJohnsonSHERMAN
Messages : 648
Inscription : dim. 13/déc./2015 11:05
Localisation : Allez, cherche...
Contact :

Re: image to Icone

Message par JohnJohnsonSHERMAN »

Intéressant en effet... Y' plus qu'a se bricoler un éditeur d'icones 8)
"Le bug se situe entre la chaise et le clavier"
Votre expert national en bogage et segfaults.

CPU : AMD A8 Quad core - RAM 8Gb - HDD 2To
  • Windows 10 x64 - PB 5.61 x64
  • Linux Ubuntu 16.04 LTS x64 (dual boot) - PB pas encore réinstallé
Avatar de l’utilisateur
Micoute
Messages : 2522
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: image to Icone

Message par Micoute »

Je plussoie.
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 5.73 PB 6.00 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Bernie
Messages : 282
Inscription : mar. 22/mars/2016 10:12
Localisation : En France

Re: image to Icone

Message par Bernie »

zorro c'est le roi du code en PB :D
Avatar de l’utilisateur
Zorro
Messages : 2185
Inscription : mar. 31/mai/2016 9:06

Re: image to Icone

Message par Zorro »

:roll:
Image
Image
Site: http://michel.dobro.free.fr/
Devise :"dis moi ce dont tu as besoin, je t'expliquerai comment t'en passer"
Avatar de l’utilisateur
omega
Messages : 617
Inscription : sam. 26/nov./2011 13:04
Localisation : Alger

Re: image to Icone

Message par omega »

Excellent ! Merci beaucoup pour le partage.
Win7 (x64) 64 bits Pb 5.72
Avatar de l’utilisateur
Kwai chang caine
Messages : 6962
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: image to Icone

Message 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)
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Avatar de l’utilisateur
MLD
Messages : 1097
Inscription : jeu. 05/févr./2009 17:58
Localisation : Bretagne

Re: image to Icone

Message par MLD »

Cool :D :wink:
Avatar de l’utilisateur
Ar-S
Messages : 9472
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: image to Icone

Message 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 ?
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
Zorro
Messages : 2185
Inscription : mar. 31/mai/2016 9:06

Re: image to Icone

Message 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
Image
Image
Site: http://michel.dobro.free.fr/
Devise :"dis moi ce dont tu as besoin, je t'expliquerai comment t'en passer"
Avatar de l’utilisateur
Zorro
Messages : 2185
Inscription : mar. 31/mai/2016 9:06

Re: image to Icone

Message 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
Image
Image
Site: http://michel.dobro.free.fr/
Devise :"dis moi ce dont tu as besoin, je t'expliquerai comment t'en passer"
Avatar de l’utilisateur
Ar-S
Messages : 9472
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: image to Icone

Message par Ar-S »

Merci pour le lien.
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
Kwai chang caine
Messages : 6962
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: image to Icone

Message 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)
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Avatar de l’utilisateur
Zorro
Messages : 2185
Inscription : mar. 31/mai/2016 9:06

Re: image to Icone

Message 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
Image
Image
Site: http://michel.dobro.free.fr/
Devise :"dis moi ce dont tu as besoin, je t'expliquerai comment t'en passer"
Répondre