[MultiPlateformes] Reconnaissance Formats principaux images
Publié : jeu. 02/déc./2010 22:21
Ce code n'est probablement pas parfait et demande peut-être à être amélioré, notamment concernant le JPEG2000, et le TARGA absent...
Code : Tout sélectionner
Enumeration
#FORMATIMAGE_JPEG=1
#FORMATIMAGE_JFIF
#FORMATIMAGE_BMP
#FORMATIMAGE_CRW ; Canon RAW
#FORMATIMAGE_PNG
#FORMATIMAGE_GIF
#FORMATIMAGE_JPEG2000
#FORMATIMAGE_PSD ; Photoshop
#FORMATIMAGE_PSP ; Paintshop Pro
#FORMATIMAGE_IFFILBM ; Amiga IFF
#FORMATIMAGE_PCX ; PaintBrush
#FORMATIMAGE_TIFF ;
EndEnumeration
Global Dim FORMATS.s(#FORMATIMAGE_TIFF)
FORMATS(0)="Format non reconnu"
FORMATS(#FORMATIMAGE_JPEG)="Format JPEG EXIF"
FORMATS(#FORMATIMAGE_JFIF)="Format JPEG JFIF"
FORMATS(#FORMATIMAGE_BMP)="Format Bitmap Windows"
FORMATS(#FORMATIMAGE_CRW)="Format Canon RAW"
FORMATS(#FORMATIMAGE_PNG)="Format PNG"
FORMATS(#FORMATIMAGE_GIF)="Format GIF"
FORMATS(#FORMATIMAGE_JPEG2000)="Format JPEG2000"
FORMATS(#FORMATIMAGE_PSD)="Format Photoshop"
FORMATS(#FORMATIMAGE_PSP)="Format PaintShop Pro"
FORMATS(#FORMATIMAGE_IFFILBM)="Format Amiga IFF ILBM"
FORMATS(#FORMATIMAGE_PCX)="Format PaintBrush"
FORMATS(#FORMATIMAGE_TIFF)="Format TIFF"
Procedure.b Fc_TestFormatFichierImage(ArgFichier.s)
Define.b ValeurRetour
Define.q Signature
Define.s SignatureChaine
Define.l *Tampon
*Tampon=AllocateMemory(1)
If ReadFile(0,ArgFichier)=0:ProcedureReturn 0:EndIf
FileSeek(0,0)
Signature=(ReadByte(0)&$FF)<<8+ReadByte(0)&$FF
If Signature=$FFD8
If FileSeek(0,6)
*Tampon=ReAllocateMemory(*Tampon,4)
If ReadData(0,*Tampon,4)
SignatureChaine=UCase(PeekS(*Tampon,4))
If SignatureChaine="EXIF"
ValeurRetour=#FORMATIMAGE_JPEG
ElseIf SignatureChaine="JFIF"
ValeurRetour=#FORMATIMAGE_JFIF
EndIf
EndIf
EndIf
ElseIf Signature=$424D
ValeurRetour=#FORMATIMAGE_BMP
ElseIf Signature=$4949 Or Signature=$4D4D
If FileSeek(0,6)
*Tampon=ReAllocateMemory(*Tampon,8)
If ReadData(0,*Tampon,8)
SignatureChaine=UCase(PeekS(*Tampon,4))
If SignatureChaine="HEAPCCDR"
ValeurRetour=#FORMATIMAGE_TIFF
EndIf
EndIf
EndIf
Else
FileSeek(0,0)
Signature=(ReadByte(0)&$FF)<<24+(ReadByte(0)&$FF)<<16+(ReadByte(0)&$FF)<<8+(ReadByte(0)&$FF)
If Signature=$38425053
ValeurRetour=#FORMATIMAGE_PSD
Goto Etiq_Fc_TestFormatFichierImage_Fin
ElseIf Signature=$89504E47
ValeurRetour=#FORMATIMAGE_PNG
Goto Etiq_Fc_TestFormatFichierImage_Fin
ElseIf Signature=$464F524D
If FileSeek(0,8)
Signature=(ReadByte(0)&$FF)<<24+(ReadByte(0)&$FF)<<16+(ReadByte(0)&$FF)<<8+(ReadByte(0)&$FF)
If Signature=$494C424D
ValeurRetour=#FORMATIMAGE_IFFILBM
Goto Etiq_Fc_TestFormatFichierImage_Fin
EndIf
EndIf
ElseIf Signature=$000C ; JPEG2000 => à améliorer
Signature=(ReadByte(0)&$FF)<<8+ReadByte(0)&$FF
If Signature='jP'
ValeurRetour=#FORMATIMAGE_JPEG2000
Goto Etiq_Fc_TestFormatFichierImage_Fin
EndIf
EndIf
FileSeek(0,0)
*Tampon=ReAllocateMemory(*Tampon,32)
If ReadData(0,*Tampon,32)
SignatureChaine=UCase(PeekS(*Tampon))
If SignatureChaine="PAINT SHOP PRO IMAGE FILE"+Chr($A)+Chr($1A)
ValeurRetour=#FORMATIMAGE_PSP
Goto Etiq_Fc_TestFormatFichierImage_Fin
EndIf
EndIf
FileSeek(0,0)
If ReadByte(0)&$FF=$A
FileSeek(0,2)
If ReadByte(0)&$FF=1
ValeurRetour=#FORMATIMAGE_PCX
EndIf
EndIf
EndIf
Etiq_Fc_TestFormatFichierImage_Fin:
If *Tampon: FreeMemory(*Tampon) :EndIf
CloseFile(0)
ProcedureReturn ValeurRetour
EndProcedure