none
Codage d'image TIFF et métadonnées EXIF RRS feed

  • Question

  • 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
    vendredi 18 mars 2011 17:07

Toutes les réponses

  • 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
    mardi 5 avril 2011 09:47
  • Bonjour,

    96 est la résol par défaut sous Windows. Je pense donc que ce n'est pas lié à la compression mais que l'encodeur TIF écrase peut-être les métadonnées avec la résolution réelle de l'image tandis que l'encodeur JPG préserverait l'information présente dans les métadonnées ?

    Il devrait être possible d'écraser à nouveau cette info avec la valeur voulue. Je pense par exemple à http://msdn.microsoft.com/en-us/library/system.drawing.imaging.propertyitem.aspx

    Un essai avec http://msdn.microsoft.com/en-us/library/ms616045.aspx pourrait peut-être permettre de voir si on voit un changement (ou un utilisant un réglage différent dans le panneau de config permettrait peut-être déjà de voir si cela altère effectivement cette information).


    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".

    mardi 2 juillet 2013 17:37