获得正确的图像旋转[重复]

2024-04-24

我有一个简单的问题:当我将图像加载到 Windows 窗体时PictureBox有些图片是旋转的,有些则不是。

基本上,用户选择带有OpenFileDialog当选择图片时:

private void OpenFD_FileOk(object sender, CancelEventArgs e)
{
    Image image = Image.FromFile(openFD.FileName);
    PB_profile.Image = image;
}

是的,我检查了原始图像旋转

EDIT:
我改变了PictureBox财产SizeMode to StretchImage


If图片包含 the 应包括方向 tag.

它对正确显示图像所需的旋转/翻转进行编码:

属性标签方向

按行和列查看图像方向。

标签 0x0112

1 - 第 0 行位于顶部 视觉图像,第0列是视觉左侧。
2 - 第 0 个 行位于图像的视觉顶部,第 0 列是 视觉右侧。
3 - 第 0 行位于视觉底部 图像,第0列是视觉右侧。
4 - 第 0 行 位于图像的视觉底部,第 0 列是视觉 左边。
5 - 第 0 行是图像的视觉左侧,并且 第 0 列是视觉顶部。
6 - 第 0 行是视觉右侧 图像的一侧,第 0 列是视觉顶部。
7 - 第 0 个 行是图像的视觉右侧,第 0 列是 视觉底部。
8 - 第 0 行是图像的视觉左侧, 第 0 列是视觉底部。

这是一个检索 a 的函数PropertyItem:

PropertyItem getPropertyItemByID(Image img, int Id)
{
  return 
    img.PropertyItems.Select(x => x).FirstOrDefault(x => x.Id == Id);
}

这是使用 GDI+ 的示例RotateFlip动态调整图像的方法:

void Rotate(Bitmap bmp)
{
    PropertyItem pi = bmp.PropertyItems.Select(x => x)
                         .FirstOrDefault(x => x.Id == 0x0112);
    if (pi == null) return; 

    byte o = pi.Value[0];

    if (o==2) bmp.RotateFlip(RotateFlipType.RotateNoneFlipX);
    if (o==3) bmp.RotateFlip(RotateFlipType.RotateNoneFlipXY);
    if (o==4) bmp.RotateFlip(RotateFlipType.RotateNoneFlipY);
    if (o==5) bmp.RotateFlip(RotateFlipType.Rotate90FlipX);
    if (o==6) bmp.RotateFlip(RotateFlipType.Rotate90FlipNone);
    if (o==7) bmp.RotateFlip(RotateFlipType.Rotate90FlipY);
    if (o==8) bmp.RotateFlip(RotateFlipType.Rotate90FlipXY);
}

它将图像更改为正确旋转的版本。

我已经测试了价值观这组漂亮的样本图像 http://www.galloway.me.uk/2012/01/uiimageorientation-exif-orientation-sample-images/.

Note:该代码仅在图像实际包含方向标签时才有效。如果没有,也许因为它们是扫描,那么就可以了nothing.

Note 2你写了我检查了原始图像旋转。这并不那么简单:资源管理器将显示已经旋转的图像,因此它们在这里看起来都是正确的,甚至检查属性也不会显示方向!

通常,当不存在 exif 数据时,PropertyTagOrientation tag is存在但只有默认值1..

Update:如果图像doesn'tPropertyTagOrientation添加方法如下:

    using System.Runtime.Serialization;
    ..

    pi = (PropertyItem)FormatterServices
        .GetUninitializedObject(typeof(PropertyItem));

    pi.Id = 0x0112;   // orientation
    pi.Len = 2;
    pi.Type = 3;
    pi.Value = new byte[2] { 1, 0 };

    pi.Value[0] = yourOrientationByte;

    yourImage.SetPropertyItem(pi);

感谢 @ne1410s 的出色表现在这里回答! https://stackoverflow.com/questions/18820525/how-to-get-and-set-propertyitems-for-an-image/25162782#25162782.

请注意添加PropertyItems不向图像添加 exif 数据;这两个是不同的标签集!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

获得正确的图像旋转[重复] 的相关文章

随机推荐

  • 使用 dplyr 进行探索性绘图

    我经常使用 d ply 来绘制探索图 一个简单的例子 require plyr plot species lt function species data p lt qplot data species data x Sepal Lengt
  • C++ 中的向量存储

    我希望存储一个大的 d 维点向量 d 固定且小 如果我定义一个Point as vector
  • Notepad++ 在每行添加数字

    我在文本文件中有以下数据 p 1 p 1 p 1 p 1 等等 我在 Notepad 中打开该文件 我该如何将其更改为 p 1 p 2 p 3 p 4 etc You can use the Column Editor mode First
  • PopupView 没有显示?

    这是 XML 只是一个网络视图
  • Mysql InnoDB性能优化和索引

    我有 2 个数据库 需要链接两个大表之间的信息 每个表超过 300 万个条目 并且不断增长 第一个数据库有一个表 pages 用于存储有关网页的各种信息 并包括每个页面的 URL URL 列是 varchar 512 并且没有索引 第二个数
  • C 语言标准集合在哪里?

    我现在致力于学习 C 我擅长 Python PHP Bash 但我决定我不能流利地使用 C 但是我无法想象在没有列表和哈希的语言中工作 也许我 我只是有点操之过急 但肯定有 标准 集合库 我在 GNU 标准库中没有看到任何内容 有什么建议吗
  • 使用 Jenkins 凭证插件以纯文本形式显示密码

    我正在尝试使用 Jenkins Credentials 插件来获取用户输入并在 Jenkinsfile 中使用它进行处理 由于密码字段高度敏感 我希望凭据插件能够屏蔽密码 使其不显示在控制台输出中 但是似乎密码以纯文本形式显示 我注意到一个
  • 如何在不使用 MATLAB 的情况下打开 .mat 文件?

    我在Matlab中做了一个项目 现在我已经卸载了Matlab 现在 我需要一些我的项目的参考 我留下了所有 mat 文件 我正在尝试在记事本中打开它们 并且我在那里得到了 unicode 字符 我的问题很简单 如何在记事本或某些文字处理器中
  • 如何将 .pb 文件转换为 .h5。 (张量流模型到keras)

    我已经使用重新训练了我的模型tensorflow现在想使用keras以避免会话内容 我怎样才能转换 pb文件至 h5 import tensorflow as tf from tensorflow keras models import s
  • 使用 IAM 角色承担的 Terraform

    我一直在使用 terraform 的访问 密钥来创建 管理我们在 AWS 中的基础设施 但是 我尝试改用 IAM 角色 我应该能够使用我的帐户中的角色并承担另一个帐户中的角色 并且应该能够运行计划 应用等以在另一个帐户中构建基础设施 有什么
  • Node.js 承诺请求返回

    我使用 promis 模块从请求模块返回 json 数据 但每次运行它时 它都会给我这个 Promise 45 0 81 0 65 null 54 null 我无法让它工作 有人知道问题所在吗 这是我的代码 function parse r
  • 无法上传 targetSdkVersion 为 30 的签名 apk

    我生成了一个签名的 apk 目标 sdk 版本为 30 Android 11 我知道它尚未正式发布 但我的应用程序已准备好接受新的更改 我正在尝试将其上传到 google play 控制台 但遇到错误 您上传的 APK 签名无效 了解更多信
  • 在开发中运行时,Google Chrome 中未设置 ASP.net core auth cookie

    我的解决方案中有三个应用程序 全部内置于 asp net core 1 MVC 6 中 应用程序 1 是一个 MVC 应用程序 用于验证用户身份 应用程序 2 是一个 Angular SPA 应用程序 是解决方案中的主要应用程序 App 3
  • 未找到指定的 VM 安装:类型标准 VM,名称 jre7

    未找到指定的 VM 安装 类型标准 VM 名称 jre7 您在 Eclipse 中构建 ant 文件时遇到过这个问题吗 那么这篇文章适合您 删除并重新创建工作区并不是解决方案 有一个简单的解决方案可以解决此问题 而无需重新创建工作区 右键单
  • 由于文件大小为零,无法连接到 NetBeans 发行版

    我最近在 Windows 10 PC 上重新安装了 Netbeans IDE 以恢复一些不相关的配置 当我尝试检查新插件以便能够下载 Sakila 示例数据库时 我收到这个错误 https i stack imgur com 1RqFL p
  • Lucene 3 上的“令牌”列表

    我是 Lucene 的新手 我开始学习版本 3 分支 但有一件事我不明白 显然是因为我在该主题上没有经验 在 Lucene 2 9 中 如果我想要一个令牌列表 我会创建一个 Token 类的 ArrayList 例如 ArrayList 这
  • 如何创建 pinterest 风格隐藏/取消隐藏导航/标签栏?

    如何创建隐藏 取消隐藏导航栏 就像 pinterest 和许多其他应用程序所做的那样 我知道基本的想法是使用 UIScrollView 委托并检测我是否向上或向下滚动并基于此显示导航栏 那么 如果导航栏隐藏 我是否还应该调整导航控制器视图高
  • 无法修改 char 数组

    考虑以下代码 char message foo void main void message bar 为什么 MPLAB IDE v8 63 中出现语法错误 我只是想改变字符数组的值 声明后不能像这样使用字符数组 如果您想为字符数组分配新值
  • 如何通过反射判断 C# 方法是否为 async/await?

    e g class Foo public async Task Bar await Task Delay 500 如果我们反思这个类和方法 我如何确定这是否是一个实际的 async await 方法 而不仅仅是一个恰好返回任务的方法 cla
  • 获得正确的图像旋转[重复]

    这个问题在这里已经有答案了 我有一个简单的问题 当我将图像加载到 Windows 窗体时PictureBox有些图片是旋转的 有些则不是 基本上 用户选择带有OpenFileDialog当选择图片时 private void OpenFD