4

您能否判断(假设使用 .NET 4.0、WinForms)JPEG 图像是否仅从其二进制文件中旋转(如 的结果File.ReadAllBytes())?

更新


到目前为止,谢谢大家的回答。

对于任何试图解决相同问题的人来说,这只是一个提示。我被这个System.Drawing.Image类欺骗了,它在初始化时加载了 EXIF 标签,FromFile(...)但在从流中初始化时似乎忽略了它们。我正在使用ExifTagCollection库来读取 EXIF 标签,但我想结果将与任何其他库相当。

var bytes = (get binary from server)
File.WriteAllBytes(path, bytes);

作品

var image = Image.FromFile(path);

不工作:(也失败FileStream了)

using (var ms = new MemoryStream(bytes))
{
    image = Image.FromStream(ms);
}

继续:

ExifTagCollection exif = new ExifTagCollection(image);
foreach (ExifTag tag in exif)
{
    Console.WriteLine(tag.ToString());
}

如果从流中加载,则没有标签。

4

4 回答 4

5

http://jpegclub.org/exif_orientation.html详细介绍了 exif 方向标志。找到那个,找到方向。

当然,这仅适用于通过设置该标志来旋转图像,这通常由相机本身、一些不是为更详细的编辑而设计的图像查看软件以及一些直接来自文件管理器的工具来完成. 如果有人将图像加载到更通用的图像编辑器中,将其翻转,然后保存它,它将无法工作。

编辑:

横向与纵向与“从图像设备自然方向旋转”不同。它也更简单:

if(img.Height == img.Width)
  return MyAspectEnum.Square;
if(img.Height > img.Width)
  return MyAspectEnum.Portrait;
return MyAspectEnum.Landscape;

这可能更接近你真正想知道的。

于 2012-08-13T10:44:22.273 回答
2

如果 EXIF 数据不可用/不可靠,您可能会认为这是识别图片格式:

  • 高度 > 宽度?纵向格式
  • 宽度 > 高度?横向格式
  • 宽度=高度?图片是完美的正方形,任何一个都可以

与 EXIF 相同的限制适用:翻转图片并且没有相应地更新/设置 EXIF 信息的物理编辑也会欺骗此检查。

于 2012-08-13T10:51:31.617 回答
1

如果您知道如何读取 JPEG 编码数据,则可以查找 EXIF 并从 EXIF 获取旋转。如果没有 EXIF 数据,那就很难了。

于 2012-08-13T10:31:18.753 回答
1

需要读取 EXIF 来确定 JPEG 图像的方向。

请查看ExifLib - 适用于 .NET 2.0+ 的快速 Exif 数据提取器。似乎库返回了此处指定的方向。

于 2012-08-13T11:09:01.347 回答