c# - 读取 JPEG 元数据时出现问题(方向)

标签 c# image-processing metadata jpeg gdi

我有一张用 iphone 拍摄的 JPEG 图片。在我的台式电脑(Windows 照片查看器、谷歌浏览器等)上,方向不正确。

我正在开发一个需要上传照片的 ASP.NET MVC 3 Web 应用程序(目前正在使用 plupload)。

我有一些服务器端代码来处理图像,包括读取 EXIF 数据。

我尝试读取 EXIF 元数据中的 PropertyTagOrientation 字段(使用 GDI - Image.PropertyItems),但该字段不存在。

所以它要么是一些特定的 iphone 元数据,要么是一些其他元数据。

我使用了另一个工具,例如 Aurigma Photo Uploader,它可以正确读取元数据并旋转图像。它是如何做到这一点的?

有谁知道 Aurigma 使用哪些其他 JPEG 元数据可以包含需要旋转所需的信息?

这是我用来读取 EXIF 数据的代码:

var image = Image.FromStream(fileStream);

foreach (var prop in image.PropertyItems)
{
   if (prop.Id == 112 || prop.Id == 5029)
   {
      // do my rotate code - e.g "RotateFlip"
      // Never get's in here - can't find these properties.
   }
}

有什么想法吗?

最佳答案

这是一个解决 8 个方向值的片段。

首先注意几点:

EXIF id 0x0112 用于定位。这是一个有用的 EXIF id 引用 http://www.sno.phy.queensu.ca/~phil/exiftool/TagNames/EXIF.html

0x0112274 的十六进制等价物。 PropertyItem.Id 的数据类型是 int,这意味着 274 在这里很有用。

此外,5029 可能应该是 0x502920521,这与 ThumbnailOrientation 相关,尽管这里可能不是我们想要的。

东方形象:

注意:img 是一个System.Drawing.Image 或继承自它,如System.Drawing.Bitmap

if (Array.IndexOf(img.PropertyIdList, 274) > -1)
{
    var orientation = (int)img.GetPropertyItem(274).Value[0];
    switch (orientation)
    {
        case 1:
            // No rotation required.
            break;
        case 2:
            img.RotateFlip(RotateFlipType.RotateNoneFlipX);
            break;
        case 3:
            img.RotateFlip(RotateFlipType.Rotate180FlipNone);
            break;
        case 4:
            img.RotateFlip(RotateFlipType.Rotate180FlipX);
            break;
        case 5:
            img.RotateFlip(RotateFlipType.Rotate90FlipX);
            break;
        case 6:
            img.RotateFlip(RotateFlipType.Rotate90FlipNone);
            break;
        case 7:
            img.RotateFlip(RotateFlipType.Rotate270FlipX);
            break;
        case 8:
            img.RotateFlip(RotateFlipType.Rotate270FlipNone);
            break;
    }
    // This EXIF data is now invalid and should be removed.
    img.RemovePropertyItem(274);
}

关于c# - 读取 JPEG 元数据时出现问题(方向),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6222053/

相关文章:

c# - 如何使 WPF 图像可禁用?

python - 拉直图像中最大的线

python-2.7 - python : How to Modify metadata of Microsoft Office files?

dart - 如何在Dart中获取顶级函数的元数据

c# - 列出 DataTable 值

c# - 没有堆栈跟踪的 WPF 崩溃

python-3.x - 如何将使用cv2.imread ('img.png',cv2.IMREAD_UNCHANGED)读取的图像转换为cv2.imread ('img.png',cv2.IMREAD_COLOR)的格式

python - 如何将具有连接像素的形状分成二值图像中的两个部分

python - Pylons 1.0 AttributeError : 'module' object has no attribute 'metadata'

c# - 创建用户向导 - 用户代码未处理空引用异常