gpt4 book ai didi

c# - 获取 EXIF 方向标签,旋转到正确的方向,处理图像并以正确的方向保存图像

转载 作者:太空狗 更新时间:2023-10-29 23:13:31 28 4
gpt4 key购买 nike

我的程序批量处理一些图像。我目前需要读取图像的 exif 方向标签,将其旋转到正确的方向,进行一些处理并保存没有任何 EXIF 方向标签但具有正确旋转的图像。(或带有正确方向的 EXIF 标签)

我正在使用 this library 读取 EXIF 和旋转:

  var bmp = new Bitmap(pathToImageFile);
var exif = new EXIFextractor(ref bmp, "n"); // get source from http://www.codeproject.com/KB/graphics/exifextractor.aspx?fid=207371

if (exif["Orientation"] != null)
{
RotateFlipType flip = OrientationToFlipType(exif["Orientation"].ToString());

if (flip != RotateFlipType.RotateNoneFlipNone) // don't flip of orientation is correct
{
bmp.RotateFlip(flip);
bmp.Save(pathToImageFile, ImageFormat.Jpeg);
}

// Match the orientation code to the correct rotation:

private static RotateFlipType OrientationToFlipType(string orientation)
{
switch (int.Parse(orientation))
{
case 1:
return RotateFlipType.RotateNoneFlipNone;

case 2:
return RotateFlipType.RotateNoneFlipX;

case 3:
return RotateFlipType.Rotate180FlipNone;
case 4:
return RotateFlipType.Rotate180FlipX;
break;
case 5:
return RotateFlipType.Rotate90FlipX;
break;
case 6:
return RotateFlipType.Rotate90FlipNone;
case 7:
return RotateFlipType.Rotate270FlipX;
case 8:
return RotateFlipType.Rotate270FlipNone;
default:
return
}
}

这行得通。但是当保存这张图片时,exif 旋转标签仍然存在,这使得图片方向错误。我能做的是

       var bmp = new Bitmap(OS.FileName);       
var exif = new EXIFextractor(ref bmp, "n");
exif.setTag(0x112, "1");
bmp.save("strippedexifimage");

但是这段代码在循环中使用时会使我的程序减慢大约 50%。有其他方法吗?可能是在应用旋转后反向旋转图像的代码,这行得通吗?

更新:

@Hans Passant 你的答案有效,但它产生的结果与图书馆产生的结果相同。当我使用 bitmap.save() 时,库和您的代码都有效。但是当我使用以下代码根据用户选择的格式保存图像时。 Imgformat 可以是 imgformat = "image/png";,imgformat = "image/jpeg"; 等一些图像仍然以错误的 exif 方向标签保存。即:我在 Windows 资源管理器中看到错误的图像预览,当我使用 MS Paint 打开图像时,图像的方向正确。我做错了什么?请帮忙。

private void saveJpeg(string path, Bitmap img, long quality)
{


EncoderParameter qualityParam = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, quality);


ImageCodecInfo Codec = this.getEncoderInfo(imgformat);
if (Codec == null)
return;

EncoderParameters encoderParams = new EncoderParameters(1);
encoderParams.Param[0] = qualityParam;
img.Save(path + ext, Codec, encoderParams);
}



private ImageCodecInfo getEncoderInfo(string mimeType)
{
// Get image codecs for all image formats
ImageCodecInfo[] codecs = ImageCodecInfo.GetImageEncoders();

// Find the correct image codec
for (int i = 0; i < codecs.Length; i++)
if (codecs[i].MimeType == mimeType)
return codecs[i];
return null;
}

最佳答案

  var exif = new EXIFextractor(ref bmp, "n")

使用库来实现功能可以为您节省大量时间。或者,当库设计不当或难以使用时,您会被困几天。 ref bmp 是第一个响亮的警报,您通过尝试将值指定为字符串而使它陷入绝望的深渊。这很有吸引力,因为您不必考虑“类型”在正确的 setTag() 重载中可能意味着什么。它是类型 3 并且需要一个包含两个元素的 byte[]。这个是完全不可发现的,你只有在不需要的时候才能正确使用这个库。

放弃图书馆,它没有帮助。存储方向的 EXIF 标签的 ID 为 0x112,编码为 16 位值。直接用System.Drawing读取值强制回1就好了,像这样:

static void FixImageOrientation(Image srce) {
const int ExifOrientationId = 0x112;
// Read orientation tag
if (!srce.PropertyIdList.Contains(ExifOrientationId)) return;
var prop = srce.GetPropertyItem(ExifOrientationId);
var orient = BitConverter.ToInt16(prop.Value, 0);
// Force value to 1
prop.Value = BitConverter.GetBytes((short)1);
srce.SetPropertyItem(prop);

// Rotate/flip image according to <orient>
switch (orient) {
// etc...
}
}

关于c# - 获取 EXIF 方向标签,旋转到正确的方向,处理图像并以正确的方向保存图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34740776/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com