2011-09-09 41 views
0

我一直在努力找出這一個難題。C#:檢索JPEG評論(不是Exif)

我想通過C#檢索jpg文件中的「Jpeg Comment」。 下面的代碼工作,但我需要基本評論而不是Exif評論。 我正在使用FastStone圖像查看器來設置基本評論。幫我找回它。

我可以使用命令行程序exiv2來驗證評論是否存在。 exiv2 -pc c:\ test.jpg(它吐出基本評論)。 exiv2 -pa c:\ test.jpg(它吐出了EXIF註釋) 我已經使用了幾個C#庫來獲取它,但他們得到了EXIF數據。

 Image x = Image.FromFile(@"c:\test.jpg"); 
     PropertyItem prop; 
     prop = x.GetPropertyItem(0x9286); 
     string Comment = Encoding.ASCII.GetString(prop.Value); 
+0

我不知道這是否會工作或沒有,但我注意到,jpegbitmapdecoder(http://msdn.microsoft.com/en-us/library /system.windows.media.imaging.jpegbitmapdecoder.aspx)具有包含註釋屬性的MetaData屬性。這可能是實際的jpeg評論,而不是exif評論,但我沒有檢查。我猜你的問題來自於這樣一個事實,即圖像有點太泛化,並且似乎沒有任何其他註釋屬性,那麼根據http://msdn.microsoft.com/en-us/exif,我們/庫/ system.drawing.imaging.propertyitem.id.aspx。 :( – Chris

+0

感謝您的反饋,但事實並非如此,我在頁面上運行了代碼,並且所有的值都爲空 – user937036

+0

對不起,我沒有太多的經驗和文檔似乎沒有幫助。我的建議是準備二進制數據從文件,並找到文本註釋手動。不適用於微弱的心,或者如果它的一個選項設置exif註釋,而不是一個標準的... – Chris

回答

0

你可以參考這個link

(感謝那些誰已經回答了同樣的問題,雖然答案是完全正確的,但不能100%解決這個問題。)

這裏有三個步驟,你需要做的:

  1. 請注意,您應該擁有克隆的Jpeg文件。
  2. 設置克隆文件的註釋。
  3. 通過刪除原始jpeg文件來替換文件。

下面是示例代碼:

public void addImageComment(string imageFlePath, string comments) 
    { 
     BitmapDecoder decoder = null; 
     BitmapFrame bitmapFrame = null; 
     BitmapMetadata metadata = null; 
     FileInfo originalImage = new FileInfo(imageFlePath); 

     if (File.Exists(imageFlePath)) 
     { 
      // load the jpg file with a JpegBitmapDecoder  
      using (Stream jpegStreamIn = File.Open(imageFlePath, FileMode.Open, FileAccess.ReadWrite, FileShare.None)) 
      { 
       decoder = new JpegBitmapDecoder(jpegStreamIn, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.OnLoad); 
      } 

      bitmapFrame = decoder.Frames[0]; 
      metadata = (BitmapMetadata)bitmapFrame.Metadata; 

      if (bitmapFrame != null) 
      { 
       BitmapMetadata metaData = (BitmapMetadata)bitmapFrame.Metadata.Clone(); 

       if (metaData != null) 
       { 
        // modify the metadata 
        metaData.Comment = comments; 

        // get an encoder to create a new jpg file with the new metadata.  
        JpegBitmapEncoder encoder = new JpegBitmapEncoder(); 
        encoder.Frames.Add(BitmapFrame.Create(bitmapFrame, bitmapFrame.Thumbnail, metaData, bitmapFrame.ColorContexts)); 
        //string jpegNewFileName = Path.Combine(jpegDirectory, "JpegTemp.jpg"); 

        // Delete the original 
        originalImage.Delete(); 

        // Save the new image 
        using (Stream jpegStreamOut = File.Open(imageFlePath, FileMode.CreateNew, FileAccess.ReadWrite)) 
        { 
         encoder.Save(jpegStreamOut); 
        } 
       } 
      } 
     } 
    }