在C#中为JPG图像添加页脚/ EXIF(二进制数据)

3

大家好,我有一张图片,希望在图片底部添加二进制数据。

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 后向输出流添加自定义数据吗? - Pieter Witvoet
@PieterWitvoet 我正在努力弄清楚这个问题,我认为我需要使用类似EXIF的东西,因为宽度和高度定义了图像。而且我不想将这个二进制(makernote)包含在图像中,我希望它作为页脚。 - Gilad
1
JpegBitmapEncoder有一个MetaData属性,也许这很有用? - Pieter Witvoet
1个回答

0

这是我对创建EXIF/MakerNote的已测试解决方案。
据我所知,37500是EXIF中MakerNote的十六进制标签。

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);
        }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接