Question Codage d'image TIFF et métadonnées EXIF

  • vendredi 18 mars 2011 17:07
     
      A du code

    Bonjour,

    J’ai un souci avec la compression de fichiers TIFF dans une appli WinForm utilisant le noyau WPF (PresentationCore et WindowsBase).

    Le problème porte sur les métadonnées EXIF qui sont altérées par la compression. Le fichier compressé comporte bien toutes les métadonnées du fichier source, à l’identique, sauf pour la résolution X et Y qui passe invariablement à 96 alors qu’elle est de 180 dans l’image source.

    Voici le code que j’utilise pour réaliser cette compression :

     

     Private Sub CompressionTiff()
    
      Dim PathImg As String = Path.Combine("C:\Users\Alain\Desktop", "IMG_8233PhShop_180ppi.tif")
      Dim PathDst As String = Path.Combine("C:\Users\Alain\Desktop", "Essai.tif")
    
      Dim StreamMeta As FileStream = Nothing
      Dim StreamDst As FileStream = Nothing
    
      Try
       ' Créer la bitmap source
       Dim BitmapImage As Bitmap = New Bitmap(PathImg)
    
       ' Créer l'encodeur
       Dim encoder As TiffBitmapEncoder = New TiffBitmapEncoder
    
       ' Extraire les métadonnées de la source si elles existent
       StreamMeta = New FileStream(PathImg, FileMode.Open, FileAccess.Read)
       Dim bf As BitmapFrame = BitmapFrame.Create(StreamMeta, BitmapCreateOptions.DelayCreation, BitmapCacheOption.None)
       Dim meta As BitmapMetadata = DirectCast(bf.Metadata, BitmapMetadata)
    
       ' Créer une bitmap managée
       Dim bitmapSource As BitmapSource = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap( _
        BitmapImage.GetHbitmap(), _
        IntPtr.Zero, _
        Int32Rect.Empty, _
        System.Windows.Media.Imaging.BitmapSizeOptions.FromEmptyOptions())
    
       ' Créer une Frame avec les métadonnées
       Dim bf2 As BitmapFrame = BitmapFrame.Create(bitmapSource, Nothing, meta, Nothing)
      
       ' Créer un encodeur et lui ajouter la Frame
       encoder.Frames.Add(bf2)
    
       StreamDst = New FileStream(PathDst, FileMode.Create)
       encoder.Save(StreamDst)
    
    
      Catch ex As Exception
       MsgBox(ex.Message)
    
      Finally
       If StreamDst IsNot Nothing Then StreamDst.Close()
       If StreamMeta IsNot Nothing Then StreamMeta.Close()
      End Try
    
     End Sub
    
    
     

     

    Le même code, utilisant JpegBitmapEncoder fournit un résultat correct avec une image JPEG : tous les EXIF de l'image compressée sont identiques à ceux de l'image source.

    Avez-vous une idée de l'origine de la distorsion avec le TiffBitmapEncoder… ?

    Merci de votre aide.

     

     


    Alain

Toutes les réponses

  • mardi 5 avril 2011 09:47
     
     

    L'utilisation des méta données EXIF sur les images ainsi que des encodeurs est bien difficile à maîtriser.

    Je n'ai pas trouvé d'exemple suffisamment développé. En existe-t-il à votre connaissance ?

    Personne n'a d'information pour m'aider sur ce problème ?

    Merci de votre aide.

     


    Alain