C#/System.Drawing:在JPEG文件中保留COM标记(无EXIF)

3
我正在进行一个最小损失的90度旋转, 使用以下代码:
System.Drawing.Image originalImage = System.Drawing.Image.FromFile("input.jpg");
ImageFormat sourceFormat = originalImage.RawFormat;
EncoderParameters encoderParams = null;
try
{
    if (sourceFormat.Guid == ImageFormat.Jpeg.Guid)
    {
        encoderParams = new EncoderParameters(1);
        encoderParams.Param[0] = new EncoderParameter(Encoder.Transformation,
            (long)EncoderValue.TransformRotate90);
    }
    originalImage.Save("output.jpg", GetEncoder(sourceFormat), encoderParams);
}
finally
{
    if (encoderParams != null)
        encoderParams.Dispose();
}

然而保存函数似乎会从原始(纯净的,没有EXIF)JPEG COM标记(0xFE)中创建EXIF元数据。我不想在输出的JPEG中保留EXIF标记。我还想保留原始的COM标记。在我的应用程序中,有哪些C# API可以代替使用该函数来保存旋转后的缓冲区?
使用jpegdump(dicom3tools软件包):
$ jpegdump < input.jpg
[...]
Offset 0x0014 Marker 0xfffe COM Comment length variable 0x10

当:

$ jpegdump < output.jpg
[...]
Offset 0x0014 Marker 0xffe1 APP1 Reserved for Application Use length variable 0x5a

这个有帮助吗?https://dev59.com/KHvaa4cB1Zd3GeqPDG5p - T.Schwarz
1
你可能想要查看 jpegtran 代码 (维基百科条目)。只要图像的尺寸是完整的MCU块,即尺寸可被8或16整除,jpegtran可以对jpeg图像进行无损旋转。 - StarGeek
GetEncoder 函数是做什么的?我期望它会返回类似于 ImageCodecInfo.GetImageEncoders().FirstOrDefault(e => e.FormatID == sourceFormat.Guid) 的内容。 - Charlieface
2个回答

1

结果表明,我能想到的唯一可行的解决方案是将JPEG保存到MemoryStream中,然后使用以下解决方案对这个临时流进行后处理:

伪代码:

var jpegPatcher = new JpegPatcher();
FileStream outFile = new FileStream(fileName, FileMode.Open, FileAccess.Write);
jpegPatcher.PatchAwayExif(inStream, outFile);

我使用了这篇博客中的代码,它实现了以下功能:
private void SkipAppHeaderSection(Stream inStream)
...
  while (header[0] == 0xff && (header[1] >= 0xe0 && header[1] <= 0xef))

因此,函数名称PatchAwayExif有点奇怪,因为它还会删除APP0(也称为JFIF)段......但这也是我需要的内容。

-1

我可能错了,但是当你旋转图像的方式时,你并没有转换像素矩阵,而只是改变EXIF数据来告诉图像方向。

因此,当你保存它时,它只是在原始图像中添加EXIF方向标志。

如果你删除了那个EXIF数据,图像就会失去它的90度旋转。

关于旋转EXIF标志的更多信息 - 这里

通过更改EXIF旋转图像的示例 - 这里

如果您使用 Image.RotateFlip 进行物理旋转图像,则可以使用 originalImage.RemovePropertyItem(0x0112) 删除 exif 数据。


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