.Net 缩略图在从移动设备创建时会旋转图像

2023-12-01

我正在使用以下老问题答案中的代码来设置上传图像的缩略图。

https://stackoverflow.com/a/2001462/1593395

这工作完美,可以填充图像,保持纵横比等,但如果我从手机上传图像,则通过此方法保存的缩略图将逆时针旋转 90 度。

你知道是什么原因造成的吗?原始图像只是使用 AjaxFileUpload1.SaveAs(MapPath("~/catalog/images/" & imageFilename)) (来自 AJAX 控制工具包)保存,并以正确的方向显示。

Thanks


也许是因为图像物理存储的方向与显示的方向不同,例如,用相机横向拍摄的 640*480 镜头可能会存储为 480*640,并带有方向 exif 数据标志。

这很棒,因为资源管理器/绘画/Photoshop/几乎每个观看者都会看到该 exif 标志并在渲染之前旋转它。但是,.net Image 类不会(当您知道发生了什么时,这似乎是合理的),因此您必须在新的缩略图上设置 exif 旋转属性(我不喜欢这样做,只是因为我不喜欢缩略图上有任何属性)或自己检查并旋转缩略图。

下面是执行此操作的粗略方法。请注意,我提供了 C# 代码作为您引用的答案的修改版本,因为这也是 C# 的。转换到 vb.net 应该非常简单:)

  if (sourceImage.PropertyIdList.Contains(0x112)) //0x112 = Orientation
  {
     var prop = sourceImage.GetPropertyItem(0x112);
     if (prop.Type == 3 && prop.Len == 2)
     {
        UInt16 orientationExif = BitConverter.ToUInt16(sourceImage.GetPropertyItem(0x112).Value, 0);
        if (orientationExif == 8)
        {
           newImage.RotateFlip(RotateFlipType.Rotate270FlipNone);
        }
        else if (orientationExif == 3)
        {
           newImage.RotateFlip(RotateFlipType.Rotate180FlipNone);
        }
        else if (orientationExif == 6)
        {
           newImage.RotateFlip(RotateFlipType.Rotate90FlipNone);
        }
     }
  }

所以更新后的FixedSize代码将是这样的:

static Image FixedSize(Image imgPhoto, int Width, int Height)
{
    int sourceWidth = imgPhoto.Width;
    int sourceHeight = imgPhoto.Height;
    int sourceX = 0;
    int sourceY = 0;
    int destX = 0;
    int destY = 0;

    float nPercent = 0;
    float nPercentW = 0;
    float nPercentH = 0;

    nPercentW = ((float)Width / (float)sourceWidth);
    nPercentH = ((float)Height / (float)sourceHeight);
    if (nPercentH < nPercentW)
    {
        nPercent = nPercentH;
        destX = System.Convert.ToInt16((Width -
                      (sourceWidth * nPercent)) / 2);
    }
    else
    {
        nPercent = nPercentW;
        destY = System.Convert.ToInt16((Height -
                      (sourceHeight * nPercent)) / 2);
    }

    int destWidth = (int)(sourceWidth * nPercent);
    int destHeight = (int)(sourceHeight * nPercent);

    Bitmap bmPhoto = new Bitmap(Width, Height,
                      PixelFormat.Format24bppRgb);
    bmPhoto.SetResolution(imgPhoto.HorizontalResolution,
                     imgPhoto.VerticalResolution);

    Graphics grPhoto = Graphics.FromImage(bmPhoto);
    grPhoto.Clear(Color.Red);
    grPhoto.InterpolationMode =
            InterpolationMode.HighQualityBicubic;

    grPhoto.DrawImage(imgPhoto,
        new Rectangle(destX, destY, destWidth, destHeight),
        new Rectangle(sourceX, sourceY, sourceWidth, sourceHeight),
        GraphicsUnit.Pixel);

    grPhoto.Dispose();

    //Rotate image to what is expected.
    if (imgPhoto.PropertyIdList.Contains(0x112)) //0x112 = Orientation
    {
       var prop = imgPhoto.GetPropertyItem(0x112);
       if (prop.Type == 3 && prop.Len == 2)
       {
          UInt16 orientationExif = BitConverter.ToUInt16(sourceImage.GetPropertyItem(0x112).Value, 0);
          if (orientationExif == 8)
          {
             bmPhoto.RotateFlip(RotateFlipType.Rotate270FlipNone);
          }
          else if (orientationExif == 3)
          {
             bmPhoto.RotateFlip(RotateFlipType.Rotate180FlipNone);
          }
          else if (orientationExif == 6)
          {
             bmPhoto.RotateFlip(RotateFlipType.Rotate90FlipNone);
          }
       }
    }

    return bmPhoto;
}

请注意,这并不涵盖所有 exif 方向,仅涵盖常见的方向。

参考:

http://www.impulseadventure.com/photo/exif-orientation.html

http://msdn.microsoft.com/en-us/library/xddt0dz7.aspx

p.s:这是我的第一个堆栈溢出答案,所以请简单地对待反馈;)

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

.Net 缩略图在从移动设备创建时会旋转图像 的相关文章

  • 由于索引无效,无法加载计数器名称数据 -Exception

    我使用 C 和 WPF 操作系统是 windows 7 Professional 和 Visual Studio 2012 SQL Server 2012 我在wpf中使用了Devexpress Grid 我想使用 ADO Net 服务器模
  • 自定义代码访问安全属性

    我创建了以下属性 Serializable AttributeUsage AttributeTargets Class AttributeTargets Method AllowMultiple true Inherited true pu
  • 在 SQL 2005+ 中,CLR 存储过程是否优于 TSQL 存储过程?

    我目前的观点是否定的 更喜欢 Transact SQL 存储过程 因为它们是重量更轻且 可能 性能更高的选项 而 CLR 过程允许开发人员进行各种恶作剧 然而最近我需要调试一些写得非常糟糕的 TSQL 存储过程 像往常一样 我发现许多问题是
  • 尝试对无法访问的主机进行套接字操作

    一位客户在连接到我们的服务器服务的 WCF 客户端上报告了此错误 消息 尝试对无法访问的主机进行套接字操作 类型 System Net Sockets SocketException 从这个链接http msdn microsoft com
  • 循环访问 VB.NET 中的控件

    我正在创建一个国际象棋程序 它由六十四个黑白背景颜色交替的图框组成 我已经给它们命名了pba1 pba2 pbb1 pbb2 pbc1等等 现在 我只想循环遍历黑色的 例如 我只想循环遍历pba1 pbb2 pbc3等 如何在 VB NET
  • 控件的命名约定[重复]

    这个问题在这里已经有答案了 Microsoft 在其网站上提供了命名指南 here http msdn microsoft com en us library xzf533w0 VS 71 aspx 我还有 框架设计指南 一书 我找不到有关
  • 垃圾收集器是否在单独的进程中运行?

    垃圾收集器是否在单独的进程中启动 例如 如果我们尝试测量某段代码所花费的进程时间 并且在此期间垃圾收集器开始收集 它会在新进程上启动还是在同一进程中启动 它的工作原理如下吗 Code Process 1 gt Garbage Collect
  • 在 String.Format 中插入格式化字符?

    我用谷歌搜索了这个 但 VB Net 2008 似乎不允许在 String Format 中插入格式化字符 例如 t r n BAD MessageBox Show String Format 0 tab 1 Foo Bar BAD Mes
  • UDP SocketException - 通常只允许每个套接字地址使用一次

    尽管这里有很多非常相似的问题 但提供的答案都没有帮助我 这让我很难过 我有一个非常大的管理系统 我的任务是为其编写一些 UDP 数据包发送 接收 我已经编写了一个原型 一切都很好 所以我开始将我的代码合并到所述系统中 然而 我现在弹出了一个
  • 如何防止用户控件表单在 C# 中处理键盘输入(箭头键)

    我的用户控件包含其他可以选择的控件 我想实现使用箭头键导航子控件的方法 问题是家长控制拦截箭头键并使用它来滚动其视图什么是我想避免的事情 我想自己解决控制内容的导航问题 我如何控制由箭头键引起的标准行为 提前致谢 MTH 这通常是通过重写
  • 参考装配错误

    我已经实现了 RoleProvider 类 在那里我创建了位于另一个程序集中的 Domain 类对象 我的程序集具有对该程序集的引用 错误 3 类型 System Data Entity DbContext 是在 未引用的程序集 您必须添加
  • UdpClient 在多个侦听器上接收数据

    我有一个实现自动发现机制的应用程序 但我遇到了 UdpClient 问题 只要应用程序的单个实例打开 它就可以正常工作 然而 当第二个实例打开时 只有第一个实例接收单播数据包 有趣的是 实现相同机制的类似应用程序似乎没有这个问题 有什么建议
  • F# 之于 IronPython/IronRuby 就像 C# 之于 VB.NET 一样?

    我刚刚听了Chris Smith 谈论 F 的播客 http www code magazine com codecast index aspx messageid 7feb501f 25c8 432a 9624 97082f1e75e8他
  • NUnit 测试项目的 log4net 配置部分

    我正在使用名为 AssemblyTest nunit 的项目运行 NUnit 该测试调用另一个使用 log4net 程序集的程序集 这是使用 nunit 版本 2 4 3 和 net 2 0 框架 在 TestFixtureSetup 中
  • ASP.NET 更新面板停止 jquery 工作

    我已经为 mouseenter mouseleave 以及 jquery Draggable 绑定了 jquery 事件集 div 被放置在更新面板中 当单击按钮时 信息将发送到数据库并更新更新面板 但是 当面板更新时 jquery 事件不
  • 为什么.NET Framework 4.0安装程序的大小小于3.0/3.5?

    我看到 Net Framework 4 0的beta2安装程序只有55MB 而 Net 3 5的安装程序有200 MB 这是怎么回事 NET 3 5 之所以这么大 是因为它在同一个包中包含 x64 版本的框架 2 0 3 0 软件包针对 x
  • 在线找到具有两个不同参数的多个匹配绑定

    我在同一个功能文件中写了两行 何时 When user action1 key1 with value1 for atttributeType Value in Filename1 SectionId1 Then abc When user
  • 为什么 True 等于 -1

    我想知道为什么 True 等于 1 而不是 1 如果我没记错的话 以前 在 C 语言中 true 将等于 1 Dim t f As Integer t True f False Console WriteLine t 1 Console W
  • 如果将其名称作为参数传递,如何在方法中打开表单

    我正在尝试创建一个标准方法来根据传递给它的参数打开表单 基本上 要完成此任务 using Quotes newQte new Quotes newQte ShowDialog 通过替换 Quotes with a passed parame
  • DI Control-Freak 反模式:难以理解

    我正在阅读 Mark Seemann 写的 NET 中的依赖注入 但我无论如何也无法理解这一点 虽然new当涉及到 VOLATILE 时 关键字是一种代码味道 依赖性 您无需担心将其用于稳定 依赖性 这new一般来说 关键字不会突然变得 非

随机推荐

  • 在react-native-pager-view(或任何其他)内动态更改内容

    我正在开发一个项目 我将在寻呼机视图中逐页显示某本书的详细信息和信息作为页面组件 该书包含 500 多个页面 所以我不能只创建 500 个页面组件 例如并将它们插入到寻呼机中 我想的是我可以获得一个特定的页面 仅在上一页和下一页旁边呈现其组
  • 画布不渲染以前的图像

    我有一个 asp net 网络应用程序 我使用 Web 套接字和 HTML5 canvas 将图像渲染到我的网页 这是 JS function setUpImageProc desktopImage onload function ctxL
  • WebKit 边框半径和过渡错误

    在 Google Chrome 的最新稳定版本 版本 31 0 1650 63 m 也包括 Canary 中 当涉及边框半径和过渡时 仍然存在错误 应用了边框半径的元素内的内容在动画结束之前不会被剪切 我已经设法通过转换 顶部 和 左侧 属
  • Chrome 在哪里存储 cookie?

    假设我使用以下命令设置了 cookiesetcookie 函数于PHP setcookie name foo false false 我可以在以下位置看到它 chrome settings cookies 但是 我找不到硬盘上存储的实际文件
  • PDFMiner 无法提取字体

    我正在使用 PDFMiner 将一些 pdf 报告转换为纯文本 并且我的一堆输入 pdf 只是输出了几行可识别的行 然后是一个 cid d 列表 有点像这样 检查报告 用户ID 4 用户ID 5 用户ID 6 用户ID 7 用户ID 8 用
  • 来自本地文件系统的 jQuery Ajax 请求(Windows file:///)

    我正在尝试执行 ajax 请求来获取内容 http localhost 在 Windows Wamp 服务器上运行 该脚本是从这样的地方运行的 file C my path index html 我只是使用标准 ajax 请求来尝试获取 l
  • 无法将正则表达式与 sed 匹配

    我正在尝试匹配一个模式 d x d x d x with sed没有运气 我正在运行的文件是这样的 name something version 0 0 1 description some desc main gulpfile js di
  • 如何在单选按钮组的 *ngFor 中设置最初选定的单选按钮

    Before我使用表单验证一切正常 我的单选按钮组 html 如下所示 div class form group row div
  • Pyglet 的 FPS 是显示器刷新率的一半

    我是 Pyglet 的新手 我编写了一个小程序 可以在屏幕上移动一个球 现在我很难建立 60 fps 的稳定帧速率 虽然 Pyglet 应该与我的显示器的 60Hz 刷新率同步 但 Pyglet 将我的 fps 设置为刷新率的一半 例如 当
  • 将 SSIS 包作为 SQLAgent 作业执行

    我有一个 SQL Server 2008 SSIS 作业 它执行一些 Win 32 exe 文件 当我通过 BIDS 在 Windows 2008 机器上 执行作业时 该作业运行良好 现在我已将包部署在 MSDB 数据库中 并尝试将包作为
  • Prolog算术语法

    如何定义a作为整数 浮点数 我想找到以下结果a b c d 10 where a b c d是整数并且 gt 0 这是一个简单 现代 纯 Prolog 非 CLP 库的解决方案 range X member X 0 1 2 3 4 5 6
  • 对 有效吗?

    以下是有效的 HTML 吗 我特别想知道的是
  • 在 Ruby 中使用数组联合运算符 |= 时,为什么必须在访问器上显式调用 self?

    以这个类为例 class MyClass attr accessor values uniq values def initialize value self uniq values default value self values de
  • 编辑 mongo.conf 后 MongoDB 状态失败(代码退出,状态 = 2)

    我正在尝试使用以下命令远程连接到我的 Google Cloud 服务器Robo 3T也连接MongoDB v4 0 11这样我就可以从窗口看到数据 我运行的是 Ubuntu 18 04LTS Minimal 为了启用 MongoDB 的远程
  • Node js - 创建持久的私人聊天室

    我最近读了很多关于 Node js 的文章 聊天功能看起来非常不错 然而 我见过的唯一的聊天示例基本上都是将聊天服务器广播到固定的 URL 如会议室 是否可以部分使用node js来创建一个更像gchat的聊天客户端 在当前页面上弹出聊天窗
  • MATLAB 中有没有办法计算哪些离散图像区域包围或被另一个区域包围?

    给出下图 我想确定哪些彩色区域被哪些其他彩色区域包围或包围哪些其他彩色区域 这是如何计算的 有没有办法创建一种显示此信息的树或表 示例 所有红色像素都在黄色区域内 据我所知 没有内置函数可以执行此计算 但这里有一个关于如何获取所需信息的想法
  • 生成 2 个不同的随机数 C#

    我想生成两个彼此不同的随机数 例如 如果第一个随机数生成 5 我希望生成的下一个随机数不等于 5 到目前为止 这是我的代码 Random ran new Random int getRanNum1 ran Next 10 int getRa
  • 如何防止 UIView 调整大小以适应 ScrollView 高度(自动调整大小已禁用)?

    我正在使用 vfr reader 库编写 PDF 阅读器 为了横向显示两个页面 我将每个页面渲染到自己的视图中 然后将这两个视图添加到容器视图中 然后将容器视图添加到滚动视图中 每个视图的 autoresizingMask 设置为 UIVi
  • Jacoco 排除类

    您好 我正在尝试使用 jacoco 排除代码覆盖率的类 我想排除 gui 文件夹及其中的所有类
  • .Net 缩略图在从移动设备创建时会旋转图像

    我正在使用以下老问题答案中的代码来设置上传图像的缩略图 https stackoverflow com a 2001462 1593395 这工作完美 可以填充图像 保持纵横比等 但如果我从手机上传图像 则通过此方法保存的缩略图将逆时针旋转