[MultiPlateformes] Reconnaissance Formats principaux images

Partagez votre expérience de PureBasic avec les autres utilisateurs.
boddhi
Messages : 604
Inscription : lun. 26/avr./2010 16:14
Localisation : S 48° 52' 31'' / O 123° 23' 33''

[MultiPlateformes] Reconnaissance Formats principaux images

Message par boddhi »

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
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: [MultiPlateformes] Reconnaissance Formats principaux ima

Message par Backup »

merci :) ça peut servir :)
Répondre