图像在移动设备上正确旋转,而不是在桌面上正确旋转

2023-12-28

我上传的图片遇到了奇怪的问题。当我在 iPhone 和 iPad 上查看它们时,它们会正确旋转,但每当我尝试在桌面上查看它们时,它们都会以错误的方向显示。 我找不到错误,在花了几个小时弄乱 EXIF 数据后,我几乎要放弃了。 修复方向后,我还调整了图像的大小,但这不应该干扰其他代码。如果确实如此,我会将其包括在内。

我没有足够的声誉来上传图像,但这里有一个链接:
https://i.stack.imgur.com/gdayA.png https://i.stack.imgur.com/gdayA.png
https://i.stack.imgur.com/RgPrG.png https://i.stack.imgur.com/RgPrG.png

这是我用来上传的代码:

$path_parts = pathinfo($_FILES["file"]["name"]);
$filepath = $_FILES['file']['tmp_name'];
$image = imagecreatefromstring(file_get_contents($filepath));

// Rotate image correctly!
$exif = exif_read_data($image);
if(!empty($exif['Orientation'])) {
    switch($exif['Orientation']){
        case 1: // nothing
        break;
        case 2: // horizontal flip
        $image = imageflip($image, IMG_FLIP_HORIZONTAL);
        break;
        case 3: // 180 rotate left
        $image = imagerotate($image,180,0);
        break;
        case 4: // vertical flip
        $image = imageflip($image, IMG_FLIP_VERTICAL);
        break;
        case 5: // vertical flip + 90 rotate right
        $image = imageflip($image, IMG_FLIP_VERTICAL);
        $image = imagerotate($image,-90,0);
        break;
        case 6: // 90 rotate right
        $image = imagerotate($image,-90,0);
        break;
        case 7: // horizontal flip + 90 rotate right
        $image = imageflip($image, IMG_FLIP_HORIZONTAL);
        $image = imagerotate($image,-90,0);
        break;
        case 8:    // 90 rotate left
        $image = imagerotate($image,90,0);
        break;
    }
}

switch ($path_parts['extension']) {
    case 'gif' :
    $im = imagecreatefromgif($image);
    break;
    case 'jpg' :
    $im = imagecreatefromjpeg($image);
    break;
    case 'png' :
    $im = imagecreatefrompng($image);
    break;
    case 'bmp' :
    $im = imagecreatefrombmp($image);
    break;
}
if($im){
    imagejpeg($im, $_FILES['file']['tmp_name'], 40);    
}
$image_path = 'd_'.time() . "." . $path_parts['extension']; 
$move_result = move_uploaded_file($_FILES['file']['tmp_name'], '../img/results/' . $image_path);

如果您知道为什么它只能在某些平台上正确旋转,我将非常感激!

编辑:可能应该澄清图像最常从智能手机或平板电脑上传。


有一些错误会导致代码停止工作。尝试打开错误报告 http://php.net/manual/en/language.errors.basics.php帮助您调试此类问题。

  • exif_read_data()作用于文件,而不是 GD 资源,所以通过$filepath代替$image.
  • imageflip()直接操作资源并返回bool所以将返回值分配给$image破坏资源。
  • 第二switch()根本不需要声明。这imagecreatefrom___()函数从文件创建资源,但您向它们传递一个已经创建的资源 - 您所需要做的就是输出它。

否则,方向校正似乎很准确并且应该适合您(它适用于我用手机拍摄的各种测试照片)。

这是更正后的代码:

$path_parts = pathinfo($_FILES["file"]["name"]);
$filepath = $_FILES['file']['tmp_name'];
$image = imagecreatefromstring(file_get_contents($filepath));

// Rotate image correctly!
$exif = exif_read_data($filepath);
if (!empty($exif['Orientation'])) {
    switch ($exif['Orientation']) {
        case 1: // nothing
            break;
        case 2: // horizontal flip
            imageflip($image, IMG_FLIP_HORIZONTAL);
            break;
        case 3: // 180 rotate left
            $image = imagerotate($image, 180, 0);
            break;
        case 4: // vertical flip
            imageflip($image, IMG_FLIP_VERTICAL);
            break;
        case 5: // vertical flip + 90 rotate right
            imageflip($image, IMG_FLIP_VERTICAL);
            $image = imagerotate($image, -90, 0);
            break;
        case 6: // 90 rotate right
            $image = imagerotate($image, -90, 0);
            break;
        case 7: // horizontal flip + 90 rotate right
            imageflip($image, IMG_FLIP_HORIZONTAL);
            $image = imagerotate($image, -90, 0);
            break;
        case 8:    // 90 rotate left
            $image = imagerotate($image, 90, 0);
            break;
    }
}

imagejpeg($image, $_FILES['file']['tmp_name'], 40);

$image_path = 'd_'.time() . "." . $path_parts['extension'];
$move_result = move_uploaded_file($_FILES['file']['tmp_name'], '../img/results/' . $image_path);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

图像在移动设备上正确旋转,而不是在桌面上正确旋转 的相关文章

  • 为什么当尝试使用 $this->data 访问 CakePHP 时,密码字段为空?

    我正在实现一个身份验证组件 这是我的注册页面 create User array action gt login echo form gt input primary email array size gt 32 echo form gt
  • 基本表创建 fpdf

    我找不到使用 fpdf 制作表格并从 mysql 数据库获取数据的合适教程 我只是想知道如何创建一个 我在网上尝试示例时遇到了很多错误 例如 我有 名字 中间名 姓氏 年龄 和 电子邮件 列 如何使用 fpdf 创建表格并回显数据库中的条目
  • TCPDF/PHP 和字体:大写数字(血统数字?旧样式?)

    我得到了一种特殊的字体 上面有这样的数字 例如 正如您在 3 上看到的 一些数字下降到基线以下 我想要实现的是 这些数字不会低于该线 并且看起来像这样 在 Word 中 可以在相同字体的字符设置中轻松设置 如何在 TCPDF 中呈现数字 我
  • CSS 无法与 CodeIgniter 一起使用

    这是我的 CI 代码的一部分 class page extends CI Controller var Page public function construct parent construct this gt Page 1 this
  • 如何计算加权平均值?

    我的语言是PHP 但是算法应该是相当通用的 我有一个关联数组 比方说 评级和评级次数 ratings array 1 gt 1 2 gt 3 3 gt 6 4 gt 3 5 gt 3 这相当于 1 2 2 2 3 3 3 3 3 3 4 4
  • PHP 的 PDO 可以限制为单个查询吗?

    PHP 的 PDO 允许通过 query 方法或作为准备好的语句同时执行多个查询 以下两个示例均有效 Two SQL queries query SELECT FROM table DROP table Execute via query
  • 如何读取 XML 文件并从中获取值以在 PHP 编码的 HTML 页面中显示

    我有一个 XML 文件 其中有一些重复的标签 其中包含不同的值 我需要获取这些值并显示在我的网页中 请帮助我得到这个 如果您使用 PHP5 可以查看 SimpleXML 您可以在这里找到介绍教程 http www w3schools com
  • PHP/MySQL:如何在网站中创建评论部分[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我不会问 如何使用 PHP MySQ
  • 从 PDO 准备好的语句中获取原始 SQL 查询字符串

    在准备好的语句上调用 PDOStatement execute 时 有没有办法让原始 SQL 字符串执行 出于调试目的 这将非常有用 我假设您的意思是您想要最终的 SQL 查询 并将参数值插入其中 我知道这对于调试很有用 但这不是准备好的语
  • iPhone 标签栏上的未读计数

    在 Cocoa Touch 上实现 TabBar 上图标的未读计数的最佳方法是什么 我想模仿 SMS 或邮件应用程序的行为 向我的应用程序的用户显示未读消息计数 并使用包含数字的红点 您正在寻找的属性称为徽章 您可以通过执行以下操作来设置它
  • 使用php将文本文件转换为xml?

    data txt ha15rs 250 home2 gif 2 ha36gs 150 home3 gif 1 ha27se 300 home4 gif 4 ha4678 200 home5 gif 5 我想使用 php 使用 simplex
  • 在 Apache 服务器上将特定的 .htm 页面处理为 .php [重复]

    这个问题在这里已经有答案了 我正在为 Apache 服务器编程 并且只需要将一个特定的 html 页面 例如 first htm 作为 PHP 脚本进行处理 可以设置吗 SetHandler http httpd apache org do
  • 维护 UISegmentedControl 中的选择

    我可以保持 UISegmentViewControl 段的选定状态吗 即 即使用户选择了另一个段 也可以保持一个段显示为选中状态 我似乎在任何地方都找不到任何可以做到这一点的东西 这是不可能开箱即用的 看如何才能选择 UISegmented
  • iPhone SDK - 在后台线程中运行重复进程

    我有一个iPhone我想在其中每隔一段时间在后台执行一个方法的应用程序1第二 所以在我的主线程中 我有以下代码UIViewController viewDidLoad NSTimer timerWithTimeInterval 1 0 ta
  • Monotouch 和本机 iOS 代码

    是否可以将使用 monotouch 编译的 C 库与单个应用程序中的 Objective C 前端链接起来 或者该应用程序必须是全部还是全无 这是可能的 但您不会从 MonoTouch 工具获得任何帮助 并且您无法摆脱这样一个事实 您仍然需
  • 通过 iPhone 连接到 AT&T 无线网络的谷歌静态地图无法工作 [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 最近 当我的 iPhone 连接到 AT T 无线网络时 我在检索静态地图时遇到了问题 但是 当我连接到本地 WiFi 时工作正常 上周日停止工作了几
  • Laravel 8、Sanctum、Fortify /logout 在 Postman 中抛出“CSRF 令牌不匹配”

    我安装了 L8 Sanctum 和 Fortify 进行身份验证 我以前可以 login 使用了Pre request Script设置X XSRF TOKEN 我什至得到了 api user成功地 但当我这样做时 logout 我在 Po
  • 应用未能及时恢复

    我在一个非常具体的场景中遇到 未能及时恢复 崩溃 我认为与看门狗相关 仅在从后台恢复时 并且仅在进入后台后在很短的时间内执行此操作 a最多几秒钟 这似乎是相关的崩溃日志 Incident Identifier E30F2238 5B15 4
  • PHP简单的html dom解析器与wordpress冲突吗?

    PHP简单的html dom解析器与wordpress冲突吗 因为每当我尝试将其与此代码一起包含在我的标头中时 一切都变成空白 感谢您提前提供任何帮助 当我尝试在 HTML 文档中使用 PHP 包含时 我遇到了同样的问题 但当我使用func
  • 禁用/启用用户访问/下载,但允许 php 编辑 - 使用 chown 和 chmod

    我想 move uploaded files到某个文件夹 比方说http localhost myproject protected 并且 PHP 应该能够rm mv cp 里面的一切protected 例如 启用 禁用用户对任何文件的访问

随机推荐

  • 什么是spark.driver.maxResultSize?

    The ref http spark apache org docs latest configuration html says 每个分区的所有分区的序列化结果总大小的限制 激发行动 例如收集 应至少为 1M 或 0 无限 如果总大小超过
  • 如何以编程方式将 Excel 数据导入到 Access 表中?

    我已经阅读了一些相关主题 但仍然留下了这个问题 我想在 Access 数据库应用程序中编写一个函数 以编程方式导入从前两行 标题和单位分隔符 之前开始的 Excel 数据 我希望完成以下任务 能够动态选择我要导入的 Excel 文件 可能使
  • 选择nodeValue但排除子元素

    假设我有这个代码 p Hello this is a description a href Click here for more a p 如何选择的nodeValuep但排除a它的内容是什么 我当前的代码 result xpath gt
  • 步骤中未找到此类 DSL 方法“管道”

    我在 Jenkins 中的声明性管道脚本中不断收到此错误 No such DSL method pipeline found among steps 我的脚本是这样的 pipeline agent any stages stage Exam
  • 谷歌存储桶文件链接可公开访问,即使不公开?

    我正在玩谷歌桶 该存储桶不是公共的 这些文件也不公开 我上传 csv 文件后 我点击它 它在谷歌浏览器的浏览器中显示了带有一个很长的复杂 url 链接的文件 现在 如果我使用该链接并在另一个没有登录谷歌帐户的浏览器 例如 IE 中打开 我就
  • C# - 应用程序显示函数之间的所有依赖关系?

    是否有某种应用程序可以分析源代码并以图形方式显示函数之间的所有连接 我需要它来处理我正在处理的遗留代码 它很大 功能齐全 而且写得很糟糕 NDepend http www ndepend com 正是这样做以及更多其他事情 代码指标
  • 汇编程序文件 (*.asm) 的 gedit 语法突出显示

    默认情况下 gedit 不进行语法高亮显示 asm files 如何添加对此语言的支持 以下步骤应该足够了 wget http www carminebenedetto net downloads asm intel lang sudo c
  • 无法使用 PowerMock 模拟 java.lang.System#exit(int) 方法

    我的应用程序有一个流程 最后是方法System exit int 正在被呼叫 我正在尝试通过使用 TestNG 运行测试来测试此流程 然而 在运行测试时 尽管测试已完成 但我收到了这条奇怪的消息 只是为了找到根本原因 我删除了System
  • 在 AngularJS 中使用 $controller 时如何消除缩小错误

    angular module mainApp controller dynamicRouteController scope controller routeParams function scope controller routePar
  • 如何在mathematica中重载Times和Plus进行矩阵乘法

    我想要超载Times and Plus例如 对于mathematica中的矩阵乘法 让Times be BitAnd 并且加上是BitOr 然后进行矩阵乘法 无论如何 有没有一种简单的方法可以做到这一点 而无需重写我自己的矩阵乘法 Than
  • Flask 多重处理

    我正在尝试开发一个小型应用程序 它基本上会根据用户提供或请求的数据集绘制一些图表 process order 函数应该并发运行不同的数据集 由于某种原因 我只得到第一张图 而不是第二张和连续的图表 我与不同的用户打开了不同的浏览器会话 得到
  • 如何在linq queryable的表达式树中调用sql标量函数?

    我正在为 Iqueryable 创建 lambda 表达式以从集合中获取值 但我想将该值转换为其他数据类型 例如 int 或decimal 因此 由于我无法将 C 转换与 Iqueryable 一起使用 因此我在 sql 中创建了用户定义的
  • 如何修复 SweetAlert2 中奇怪的成功和错误图标?

    因此一月份 SweetAlert2 100 正常 成功和错误图标上没有错误 但二月之后 图标看起来很奇怪 动画也很糟糕 我尝试更新 CDN 因为 2 天前 SweetAlert2 更新了 但问题仍然没有解决 也许你可以帮助我 这是图像 成功
  • 使用 Python 检查 zip 文件中是否存在目录

    最初我想使用os path isdir但我认为这不适用于 zip 文件 有没有办法查看 zip 文件并验证该目录是否存在 我想阻止使用unzip l 尽可能多 但如果这是唯一的解决方案 那么我想我别无选择 只需检查文件名末尾带有 的文件即可
  • 在c中使用信号量同步两个子进程

    我必须创建一个程序来同步两个进程 每个进程只打印一个字母 这样每当我们观察程序的输出时 A and B 不大于2 所以这会被接受 BAABBAABBABA 这不会是因为它打印 4 个 B 只打印 2 个 A ABBABB 因此 对于初学者来
  • 动态创建CheckBoxPreferences

    我目前正在使用网络服务中的内容动态构建带有复选框的行列表 然而 这ListView将需要做很多事情PreferenceActivity会完成 我不知道行数 因为内容是动态的 所以我无法创建每个行CheckBoxPreference在 XML
  • 如何在 Windows 下强制 Git 使用 LF 而不是 CR+LF?

    我想强制 Git 在 Windows 下签出文件LF not CR LF 我检查了两个配置选项 但无法找到正确的设置组合 我想将所有文件转换为LF换行并保留LF在文件中 备注 我用过autocrlf input但这只是在您提交文件时修复文件
  • WebRTC:确定所选的 ICE 候选者

    我有一个 webrtc 应用程序 假设有两个客户端 client1 and client2 有什么办法可以找出 ICE 候选人给出的内容吗 client1被使用client2反之亦然 因为 每次要找出这个问题 我都必须使用wireshark
  • PSQL 8.3+ 客户端查询结果显示

    这是一个相当愚蠢的问题 但我似乎无法在文档或手册页中找到答案 我认为从 8 3 开始 psql CLI 客户端将不会显示大型内联查询的结果 它通过管道传输到一个 不太像 的结果查看器 当您按 q 时该结果查看器就会消失 这使得在后续查询或更
  • 图像在移动设备上正确旋转,而不是在桌面上正确旋转

    我上传的图片遇到了奇怪的问题 当我在 iPhone 和 iPad 上查看它们时 它们会正确旋转 但每当我尝试在桌面上查看它们时 它们都会以错误的方向显示 我找不到错误 在花了几个小时弄乱 EXIF 数据后 我几乎要放弃了 修复方向后 我还调