2015-02-11 32 views
4

大家好,我有一個圖像,我想將二進制數據作爲頁腳添加到該圖像。在C#中添加頁腳/ EXIF(二進制數據)爲JPG圖像

RGBImage rgbImage = (RGBImage) RGBImage.LoadImage(@"test.tiff"); 
byte[] bytes = File.ReadAllBytes(@"C:\TEMP\gili.bin"); 
int padding =(int) Math.Ceiling((double)bytes.Length/(rgbImage.Width*3)); 
byte[] newMakerNoteImage = new byte[rgbImage[0].Data.Length + (rgbImage.Width * 3 * padding)]; 
Buffer.BlockCopy(rgbImage[0].Data, 0, newMakerNoteImage, 0, rgbImage[0].Data.Length); 
Buffer.BlockCopy(bytes, 0, newMakerNoteImage, rgbImage[0].Data.Length, bytes.Length); 

BitmapPalette myPalette = BitmapPalettes.WebPalette; 

      // Creates a new empty image with the pre-defined palette 
      BitmapSource image = BitmapSource.Create(
       rgbImage.Width, 
       rgbImage.Height, 
       96, 
       96, 
       PixelFormats.Bgr24, 
       myPalette, 
       newMakerNoteImage, 
       rgbImage.Width * 3); 

      FileStream stream = new FileStream(@"C:\TEMP\new.jpg", FileMode.Create); 
      JpegBitmapEncoder encoder = new JpegBitmapEncoder(); 
      encoder.FlipHorizontal = false; 
      encoder.FlipVertical = false; 
      encoder.QualityLevel = 30; 
      encoder.Frames.Add(BitmapFrame.Create(image)); 
      encoder.Save(stream); 

圖像輸出正常,但二進制數據不會添加到圖像的末尾。 你能告訴我,如果我做得對嗎?

我想我可能會看到這一切都錯了,我需要使用EXIF爲了將這個makernote數據添加到圖像中。數據對於圖像的用戶不可見。

+1

我希望'BitmapSource.Create'只處理相關數據,和'JpegBitmapEncoder.Save'將其轉換成不同的格式,無論如何,所以我也不會感到驚訝,如果這並未」工作。您是否在調用'JpegBitmapEncoder.Save'後嘗試將自定義數據添加到輸出流? – 2015-02-11 12:22:57

+0

@PieterWitvoet我試圖弄清楚這一點,我認爲我需要使用像EXIF這樣的東西,因爲寬度和高度定義了圖像。而且我不想將這個二進制文件(makernote)包含在我想要的頁腳中。 – Gilad 2015-02-11 12:37:19

+1

'JpegBitmapEncoder'具有'MetaData'屬性,也許這很有用? – 2015-02-11 13:17:52

回答

0

這裏是我測試過的用於EXIF/MakerNote創建的解決方案
據我所知,37500是EXIF中的makernote hexdecimal標記。

http://nicholasarmstrong.com/2010/02/exif-quick-reference/

public void CreateMakerNoteJpgImage(byte[] makerNoteArray, string path) 
     { 
      BitmapPalette myPalette = BitmapPalettes.WebPalette; 

      // Creates a new empty image with the pre-defined palette 
      BitmapSource image = BitmapSource.Create(
       Width, 
       Height, 
       96, 
       96, 
       PixelFormats.Bgr24, 
       myPalette, 
       _channels[0].Data, 
       Width * 3); 

      FileStream stream = new FileStream(path, FileMode.Create); 

      BitmapMetadata metadata = new BitmapMetadata("jpg"); 
      //adding makernote data into EXIF of the jpeg image 
      metadata.SetQuery("/app1/ifd/exif:{uint=37500}", makerNoteArray); 

      JpegBitmapEncoder encoder = new JpegBitmapEncoder(); 
      encoder.FlipHorizontal = false; 
      encoder.FlipVertical = false; 
      encoder.QualityLevel = 30; 
      BitmapFrame frame = BitmapFrame.Create(image, null, metadata, null); 
      encoder.Frames.Add(frame); 
      encoder.Save(stream); 
     }