PHP read_exif_data 和调整方向

2023-11-21

如果方向关闭,我将使用以下代码来旋转上传的 jpeg 图像。我只遇到从 iPhone 和 Android 上传的图像问题。

if(move_uploaded_file($_FILES['photo']['tmp_name'], $upload_path . $newfilename)){
            chmod($upload_path . $newfilename, 0755);
            $exif = exif_read_data($upload_path . $newfilename);
            $ort = $exif['IFD0']['Orientation'];
            switch($ort)
            {

                case 3: // 180 rotate left
                    $image->imagerotate($upload_path . $newfilename, 180, -1);
                    break;


                case 6: // 90 rotate right
                    $image->imagerotate($upload_path . $newfilename, -90, -1);
                    break;

                case 8:    // 90 rotate left
                    $image->imagerotate($upload_path . $newfilename, 90, -1);
                    break;
            }
            imagejpeg($image, $upload_path . $newfilename, 100);
            $success_message = 'Photo Successfully Uploaded';
        }else{
            $error_count++;
            $error_message = 'Error: Upload Unsuccessful<br />Please Try Again';
        }

我从 jpeg 读取 EXIF 数据的方式是否有问题?它没有按预期旋转图像。

这就是我运行 var_dump($exif); 时发生的情况

array(41) {
    ["FileName"]=> string(36) "126e7c0efcac2b76b3320e6187d03cfd.JPG"
    ["FileDateTime"]=> int(1316545667)
    ["FileSize"]=> int(1312472)
    ["FileType"]=> int(2)
    ["MimeType"]=> string(10) "image/jpeg"
    ["SectionsFound"]=> string(30) "ANY_TAG, IFD0, THUMBNAIL, EXIF"
    ["COMPUTED"]=> array(8) {
        ["html"]=> string(26) "width="2048" height="1536""
        ["Height"]=> int(1536)
        ["Width"]=> int(2048)
        ["IsColor"]=> int(1)
        ["ByteOrderMotorola"]=> int(1)
        ["ApertureFNumber"]=> string(5) "f/2.8"
        ["Thumbnail.FileType"]=> int(2)
        ["Thumbnail.MimeType"]=> string(10) "image/jpeg" }
        ["Make"]=> string(5) "Apple"
        ["Model"]=> string(10) "iPhone 3GS"
        ["Orientation"]=> int(6)
        ["XResolution"]=> string(4) "72/1"
            ["YResolution"]=> string(4) "72/1" ["ResolutionUnit"]=> int(2) ["Software"]=> string(5) "4.3.5" ["DateTime"]=> string(19) "2011:09:16 21:18:46" ["YCbCrPositioning"]=> int(1) ["Exif_IFD_Pointer"]=> int(194) ["THUMBNAIL"]=> array(6) { ["Compression"]=> int(6) ["XResolution"]=> string(4) "72/1" ["YResolution"]=> string(4) "72/1" ["ResolutionUnit"]=> int(2) ["JPEGInterchangeFormat"]=> int(658) ["JPEGInterchangeFormatLength"]=> int(8231) } ["ExposureTime"]=> string(4) "1/15" ["FNumber"]=> string(4) "14/5" ["ExposureProgram"]=> int(2) ["ISOSpeedRatings"]=> int(200) ["ExifVersion"]=> string(4) "0221" ["DateTimeOriginal"]=> string(19) "2011:09:16 21:18:46" ["DateTimeDigitized"]=> string(19) "2011:09:16 21:18:46" ["ComponentsConfiguration"]=> string(4) "" ["ShutterSpeedValue"]=> string(8) "3711/949" ["ApertureValue"]=> string(9) "4281/1441" ["MeteringMode"]=> int(1) ["Flash"]=> int(32) ["FocalLength"]=> string(5) "77/20" ["SubjectLocation"]=> array(4) { [0]=> int(1023) [1]=> int(767) [2]=> int(614) [3]=> int(614) } ["FlashPixVersion"]=> string(4) "0100" ["ColorSpace"]=> int(1) ["ExifImageWidth"]=> int(2048) ["ExifImageLength"]=> int(1536) ["SensingMethod"]=> int(2) ["ExposureMode"]=> int(0) ["WhiteBalance"]=> int(0) ["SceneCaptureType"]=> int(0) ["Sharpness"]=> int(1) }

根据丹尼尔的代码,我编写了一个函数,该函数可以在必要时简单地旋转图像,而无需重新采样。

GD

function image_fix_orientation(&$image, $filename) {
    $exif = exif_read_data($filename);
    
    if (!empty($exif['Orientation'])) {
        switch ($exif['Orientation']) {
            case 3:
                $image = imagerotate($image, 180, 0);
                break;
            
            case 6:
                $image = imagerotate($image, 90, 0);
                break;
            
            case 8:
                $image = imagerotate($image, -90, 0);
                break;
        }
    }
}

1线版本(GD)

function image_fix_orientation(&$image, $filename) {
    $image = imagerotate($image, array_values([0, 0, 0, 180, 0, 0, -90, 0, 90])[@exif_read_data($filename)['Orientation'] ?: 0], 0);
}

图像魔术师

function image_fix_orientation($image) {
    if (method_exists($image, 'getImageProperty')) {
        $orientation = $image->getImageProperty('exif:Orientation');
    } else {
        $filename = $image->getImageFilename();
        
        if (empty($filename)) {
            $filename = 'data://image/jpeg;base64,' . base64_encode($image->getImageBlob());
        }
        
        $exif = exif_read_data($filename);
        $orientation = isset($exif['Orientation']) ? $exif['Orientation'] : null;
    }
    
    if (!empty($orientation)) {
        switch ($orientation) {
            case 3:
                $image->rotateImage('#000000', 180);
                break;
            
            case 6:
                $image->rotateImage('#000000', 90);
                break;
            
            case 8:
                $image->rotateImage('#000000', -90);
                break;
        }
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PHP read_exif_data 和调整方向 的相关文章

  • 点击 %40 变为 %2540

    当单击包含 符号的链接时 该网址给我 40 这就是我想要的 但是一旦我点击它 一秒钟后它就在我点击后变成了 2540 单击是在电子邮件内 然后定向到网站 其中 40 更改为 2540 我怎样才能让它停止变化 它现在得到这样的参数 email
  • PHP条件,如果当前页面,则链接突出显示[关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我有一个带
  • 正则表达式上的换行符

    我试图替换两个标签之间的所有内容 但我无法构建正确的表达式 这就是我所做的
  • 禁用一个 UITabbar 项目的旋转

    我有一个 uitabbarcontroller 有 4 个选项卡栏项目 每个选项卡栏项目都有一个 uinavigationcontroller 我需要将一个 uitabbar 项目的方向锁定为仅纵向 所以我实现了以下代码 创建一个自定义标签
  • 如何检测字符串中的非 ASCII 字符?

    如果我有一个 PHP 字符串 如何以有效的方式确定它是否至少包含一个非 ASCII 字符 我所说的非 ASCII 字符是指不属于该表的任何字符 http www asciitable com http www asciitable com
  • CodeIgniter 控制器 - JSON - AJAX

    我正在尝试通过 AJAX 使用 CodeIgniter 发送表单构建 并尝试使用 JSON 获取响应 但是 我只在打开开发人员选项卡时看到响应 我什至不确定这是否实际上是响应 因为它显示了两个 json 数据 它所显示的只是加载旋转器 然后
  • 使用 PHP Selenium Webdriver 单击下拉菜单中的选项?

    我正在使用 PHP Selenium Webdriver 包装器Facebook https github com facebook php webdriver 任何人都可以给我一个如何单击或从选择下拉菜单中选择选项的示例吗 我已经尝试过这
  • PHP - 类外 use 关键字和类内 use 关键字的区别

    伙计们 美好的一天 只是想问一下有什么区别use之外的class and use在 的里面class 我也用谷歌搜索过 但我的问题与答案不匹配 Example namespace App Http Controllers Auth use
  • 使用 PHP PayPal REST API 退款?

    我正在开发一个集成到 PayPal 的 REST API 中的 PHP 应用程序 我正确处理了事务并将事务 ID 保存到 MySQL 数据库中 我现在正在尝试退款 但无法让它停止给出 传入 JSON 请求未映射到 API 请求 错误 有人对
  • 获取字符串中的最后一个整数

    我需要隔离包含多个整数的字符串中最新出现的整数 我怎样才能得到23代替1 for lastnum1 text 1 out of 23 lastnum1 this gt getEval eregi replace out of text 你可
  • 访问sendBeacon发送的数据

    文档表明sendBeacon通过发送其数据HTTP POST request 但在 PHP 中 POST变量似乎是一个空数组 这是我的 JavaScript 代码 navigator sendBeacon beacon log php My
  • 对 SimpleXML 数据进行排序和分组

    我正在对 XML 文件中的出版物数据进行排序和分组 我目前使用的方法效果很好大部分情况下 尽管我觉得有一种更有效的方法来完成我想要完成的任务 以下是目标节点的示例
  • 重写 URL,将 ID 替换为查询字符串中的标题

    我对 mod rewrite 很陌生 但我做了一些搜索 但找不到这个问题的答案 我有一个网站 它只有一个 PHP 页面 根据查询字符串中传递给它的 ID 提供数十页内容 我想重写 URL 以便此 ID消失并替换为从数据库中提取的页面标题 例
  • 如何防止布局的方向改变,而不是整个屏幕/活动的方向改变

    我需要一个子布局 可以是任何布局 例如FrameLayout or RelativeLayout 忽略方向变化并始终保持横向 但不是它的父级或任何其他兄弟布局 视图 它们应该相应地改变它们的方向 因此 我不能使用setRequestedOr
  • 如何在 Zend MVC 中实现 SSL

    我之前已经通过使用特定的安全文件夹 例如服务器上的 https 文件夹与 http 文件夹 实现了安全页面 我已经开始使用 Zend Framework 并希望应用程序的某些部分 例如登录 使用 https 我在谷歌上搜索过 甚至在这里搜索
  • Facebook PHP SDK - 如何获取访问令牌?

    我正在尝试从我的应用程序在用户的 Facebook 墙上发帖 用户授予应用程序在他的墙上发布的权限 并且我在数据库中有用户ID 我需要自动发送帖子 而无需用户再次登录 我的代码是 try require once dirname FILE
  • 使用 json_encode() 函数在 PHP 数组中生成 JSON 键值对

    我正在尝试以特定语法获取 JSON 输出 这是我的代码 ss array 1 jpg 2 jpg dates array eu gt 59 99 us gt 39 99 array1 array name gt game1 publishe
  • Codeigniter - 出现 404 Not Found 错误

    我们在 godaddy 有两个托管套餐 我们的实时网站使用以下 htaccess 文件运行良好 无需在 url 中使用 index php 即可访问网站 RewriteEngine On RewriteCond REQUEST FILENA
  • 从所有会话中注销

    我有一个注销选项 这是我的代码 session start session destroy setcookie key time 60 60 24 setcookie username time 60 60 24 我想添加另一个选项来注销所
  • 使用 crypt() 加密

    我目前正在做一个非常安全的登录系统 但我是 crypt 函数的新手 需要一些快速帮助 我在注册过程中使用 crypt 加密密码字符串并将其保存到数据库中 但是 我如何在登录过程中解密密钥 或者我应该怎么做 或者是否可以对提交的密码字符串进行

随机推荐

  • 在 C# 中使用泛型创建数学库

    是否有任何可行的方法可以使用泛型创建不依赖于选择存储数据的基本类型的数学库 换句话说 假设我想编写一个 Fraction 类 分数可以用两个整数或两个双精度数等来表示 重要的是基本的四种算术运算都有明确的定义 所以 我希望能够写Fracti
  • Java继承——构造函数

    在准备期末考试时 我在我目前正在学习的书中看到了以下陈述 考虑以下代码 class A public A int x class B extends A public B int x 是否强制在B类的构造函数中调用A类的构造函数 super
  • Facebook 请求对话框:本机 iOS 应用程序中的无摩擦请求可能吗?

    截至 2011 年 10 月 10 日 脸书 iOS SDK再次支持 apprequests 对话框 用于从本机 iOS 应用程序发送用户到用户的请求 请参阅Facebook 开发者文档中的屏幕截图举个例子 不过 与通过 Javascrip
  • ASP.Net - 在应用程序级别之外使用注册为allowDefinition ='MachineToApplication'的部分是错误的

    我们在开发环境中运行的 Intranet 应用程序上遇到此错误 我不知道去哪里 寻找解决方案 该应用程序曾经工作正常 但它与另一个开发团队在共享服务器上运行 我们在追踪错误时遇到了困难 我的团队没有对应用程序进行任何更新 它突然停止工作 我
  • ASP.Net 中 UI 层的 List<> 比 DataSet 更好吗?

    我想将数据从数据访问层获取到业务层 然后准备在 UI 中使用 所以我想知道 通过以下方式读取我的数据是否更好DataReader并用它来填充List
  • Github 下游拉取请求?

    我在 github 上有一个项目 该项目是 github 上的一个组织分叉的 我可以将我的代码向下游推送到组织的分支吗 我尝试这样做 但没能做到 我想知道我是否可以向下游发送拉取请求 GitHub 确实允许这样做 而且实际上很容易做到 尽管
  • 简单的 PIN 验证

    任务 ATM 机允许使用 4 或 6 位 PIN 码 并且 PIN 码只能包含 4 位或 6 位数字 如果函数传递了有效的 PIN 字符串 则返回 true 否则返回 false 我的解决方案 function validatePIN pi
  • 在 flutter 中使用 image.asset 时图像质量下降

    我有一个 png 的用户 Image asset 但我注意到该图像质量较差 如何在真实设备中保持相同的质量 就我而言 问题是由于图像分辨率系统的配置错误造成的 一方面 您必须在资产文件夹中指定不同的分辨率 assets my icon pn
  • 如何在 .NET 格式字符串中转义大括号(大括号)

    使用时如何转义括号string Format 例如 String val 1 2 3 String Format foo 0 val 此示例不会引发异常 但会输出字符串foo 0 有没有办法摆脱括号 供你输出 foo 1 2 3 你必须做类
  • Rails 4.0 上的 haml-rails?

    我想知道是否有人遇到过任何障碍haml railsRails 4 0 中的 gem 有一个导轨铸件这表明存在一些问题 但没有更多提及这一点 GitHub 上托管的 gem 也没有明确提及对 Rails 4 0 的支持 那么这方面的现状如何呢
  • Android:使用SimpleCursorAdapter从数据库获取数据到ListView

    我正在编写一个 Android 应用程序 它应该使用数据库来存储数据并从中读取数据 使用本教程 在 archive org 上 我得到了创建数据库的应用程序 并且能够创建新条目 但是 我不知道如何读取数据库以获取 ListView 中存储的
  • jquery 验证 onclick

    我对 jquery 验证插件有一个问题 这对我来说没有意义 请问有人能看出我的错误在哪里吗 这是我的 HTML
  • 如何有效地将一个 Pandas Dataframe 的每一列与另一个 Dataframe 的每一列相乘?

    我正在尝试将两个 pandas 数据框相乘 具体来说 我想将每一列与另一个 df 的每一列相乘 数据帧是 one hot 编码的 所以它们看起来像这样 col 1 col 2 col 3 0 1 0 1 0 0 0 0 1 我可以使用 fo
  • 使用 axios 收到 400 错误错误请求

    我正在使用 axios 并收到 400 bad request 错误 我正在使用react redux并尝试向localhost 3000 posts发送post请求 这是我正在使用的代码 import axios from axios i
  • 如何在 Reporting Services 中以 hh:mm:ss 格式显示秒的时间跨度

    在 MS Reporting Services 2008 中 我有一个字段 该字段是以秒的形式存储的持续时间 有没有一种巧妙的方法可以在报告的组部分将其转换为 hh mm ss 格式 如果您只想显示它 请转换文本框值的表达式 Format
  • 如果十进制的范围更短,为什么它比双精度更精确? C#

    Im reading the C in a Nutshell book and it shows this table 我很难理解这张桌子 它说双重需要64 bits的空间 它的范围是10 324 to 10 308 小数取128 bits
  • 服务器和客户端之间的实时视频流 - 使用 Java

    这是我正在进行的项目的一部分 我有两个桌面java应用程序 一个在服务器上运行 有真实IP 另一个是客户端 我只想从连接到服务器应用程序的网络摄像头流式传输实时视频 并在客户端应用程序上播放 我想从多个摄像机进行流媒体播放 我一直在 Xug
  • 从 Selenium webdriver 的当前窗口 GUID 获取窗口句柄 (IntPtr)

    我试图捕获整个浏览器屏幕 例如任何工具栏 面板等 的屏幕截图 而不仅仅是整个页面 所以我得到了以下代码 using FirefoxDriver driver new FirefoxDriver driver Navigate GoToUrl
  • 为什么我不能只更改 Python 中嵌套列表中的单个元素[重复]

    这个问题在这里已经有答案了 我刚刚遇到了一些关于 Python 的非常奇怪的事情 gt gt gt out 0 3 3 gt gt gt out 0 0 0 0 0 0 0 0 0 gt gt gt out 0 1 0 gt gt gt o
  • PHP read_exif_data 和调整方向

    如果方向关闭 我将使用以下代码来旋转上传的 jpeg 图像 我只遇到从 iPhone 和 Android 上传的图像问题 if move uploaded file FILES photo tmp name upload path newf