首页 > 编程语言 >PHP处理上传图片出现旋转问题

PHP处理上传图片出现旋转问题

时间:2024-03-05 11:44:40浏览次数:25  
标签:case src exif img 旋转 break img2 PHP 上传

相关参考链接:

  图像生成和处理(可交换图像信息):https://www.php.net/manual/zh/book.exif.php

一、EXIF 方向参数 Orientation 简介:

  EXIF Orientation 参数让你随便照像但都可以看到正确方向的照片而无需手动旋转(前提要图片浏览器支持,Windows 自带的不支持)。这个参数在有的照片是自带的(也可能没有),看照片时不能自动旋转,修正的方法有两个,一个看不顺眼就旋转,另一个是修改 EXIF 中的 Orientation 参数(XnView 浏览器查看缩略图时可以修改)

  Orientation 参数:其中1、3、6、8照片会比较常见,其余参数普通照片基本不会出现

参数 旋转方向
1
2 水平翻转
3 180°
4 垂直翻转
5 顺时针90°+水平翻转
6 顺时针90°
7 顺时针90°+垂直翻转
8 逆时针90°

示意图:

二、代码示例

1、PHP.ini开启 exif、gd2相关扩展

2、检测是否存在图片旋转代码示例: 

$path = "图片原图地址或上传图片时的临时地址"; //$_FILES['file']['tmp_name']
//>>检测原图是否经过旋转、有些图片可能没有exif信息exif_read_data会抛出异常
try {
    $exif_data = exif_read_data($path);
}catch (\Exception $e){
    //>>遇到无法解析的图片
    $exif_data = [];
}
$img_is_rotate = isset($exif_data['Orientation'])?(int)$exif_data['Orientation']:'';

//>>上述检测 此处判断保存的图片是否需要进行旋转
if(in_array($img_is_rotate,[3,6,8],true)){
    try {
        //>>旋转图片 此处$path 为原图地址或已将上传文件保存后的地址
        imgturn($path,$img_is_rotate);
    }catch (\Exception $e){
       //对应异常处理
       die('旋转图片异常!');
    }
}

 

3、旋转代码示例(仅供参考):

if (!function_exists('imgturn')) {
    /**
     * 旋转图片
     * @param $src
     * @param string $direction
     */
    function imgturn($src,$direction = ''){
        $ext = strtolower(pathinfo($src)['extension']);
        switch ($ext) {
            case 'gif':
                $img = imagecreatefromgif($src);
                break;
            case 'jpg':
            case 'jpeg':
                $img = imagecreatefromjpeg($src);
                break;
            case 'png':
                $img = imagecreatefrompng($src);
                break;
            default:
                die('图片格式错误!');
                break;
        }
        $width = imagesx($img);
        $height = imagesy($img);
        $img2 = imagecreatetruecolor($height,$width);
        switch ($direction){
            case 6:
                //顺时针90°
                for ($x = 0; $x < $width; $x++) {
                    for ($y = 0; $y < $height; $y++) {
                        imagecopy($img2, $img, $height - 1 - $y, $x, $x, $y, 1, 1);
                    }
                }
                break;
            case 8:
                //逆时针90°
                for ($x = 0; $x < $height; $x++) {
                    for ($y = 0; $y < $width; $y++) {
                        imagecopy($img2, $img, $x, $y, $width - 1 - $y, $x, 1, 1);
                    }
                }
                break;
            case 3:
                //180°
                $img2 = imagerotate($img, 180, 0);
                break;
        }
        switch ($ext) {
            case 'jpg':
            case "jpeg":
                imagejpeg($img2, $src, 100);
                break;

            case "gif":
                imagegif($img2, $src, 100);
                break;

            case "png":
                imagepng($img2, $src, 100);
                break;

            default:
                die('图片格式错误!');
                break;
        }
        imagedestroy($img);
        imagedestroy($img2);
    }
}

 

标签:case,src,exif,img,旋转,break,img2,PHP,上传
From: https://www.cnblogs.com/xh-xiaohan/p/18052222

相关文章

  • 小程序开发:定时删除上传的阿里云oss文件
    上文说到:我们接入了阿里云的oss,以及阿里云的人像动漫化接口。本文要完成的功能:用户上传到阿里云oss的图片需要在一天后定时删除,否则占用了存储空间。大致流程:用户上传阿里云oss成功后,将上传的文件名记录到一张表,记录有一个字段日期为过期时间,定时任务检测到过期后,先删除oss文件,......
  • 拯救php性能的神器webman-打包二进制
    看了看webman的官方文档,发现居然还能打包为二进制,这样太厉害了吧!先执行这个  composerrequirewebman/console^1.2.24 安装这个console的包,然后执行  phpwebmanbuild:bin8.1 结果谁想到它报错提示:好吧我就按照他说的执行了  php-dphar.readonly=0./webmanb......
  • 黑马程序员JavaWeb学习笔记-文件上传
    文件上传https://www.bilibili.com/video/BV1m84y1w7Tb/?p=150&spm_id_from=pageDriver&vd_source=62f4901d4d947272c439194b87ec6698当报错500时,服务端出现错误,因为默认最大为1M在application.properties里面修改文件上传的几个函数本地存储Controller层的代码import......
  • 拯救php性能的神器webman-数据库
    有了webman的这个框架,我们得看看它是怎么使用数据库的,毕竟我们不能一直用内存变量啊。好,很简单一句话跑起来。 composerrequire-Willuminate/databaseilluminate/paginationilluminate/eventssymfony/var-dumper 官方对于这里数据库的解释是:webman数据库默认采用的是......
  • v-md-editor 上传图片
    上传方法<template><v-md-editorv-model="text"left-toolbar="undoredo|image":disabled-menus="[]"@upload-image="handleUploadImage"height="500px"/></template>......
  • netcore 将图片转为pdf上传
    privatestaticstringGetImageUrl(SaveWeldListInputmodel){varfileUrl=model.ProcedureFiles[0].File_Url;//获取文件扩展名stringextension=Path.GetExtension(fileUrl);stringfilePathDic="";......
  • VScode 配置php调试环境变量. phpstudy + nginx+ php7.4, 解决无法断点问题
    参考大佬的帖子https://www.cnblogs.com/hfdp/p/17028596.htmlhttps://blog.csdn.net/qq_61739597/article/details/132433472 (远程调试)踩坑经验我从phpstudy添加好网站才进行配置.当配置好之后,一直没有断点下来. 非常郁闷找不到问题. 写了一个demo,php文件,通过......
  • ThinkPHP6实现增删改查接口
    ThinkPHP增删改查接口实现数据库连接配置当.env文件中存在数据库配置时,这些配置会覆盖config/database.php中的相应配置。在config/database.php中设置数据库连接的默认值或开发环境的值,并在.env文件中根据实际部署环境(如测试或生产环境)覆盖这些值。这样,你可以通过更改环境变量......
  • 记录一次 nginx+php 项目接口普通请求正常,但是上传接口500的问题
    由于nginx是我用brew命令安装的,很多配置都是没有更改的,包括 client_max_body_size都是默认的,上传文件时超出最大限制且缓存目录 client_body_temp没有设置写入权限,所以导致接口500打开nginx.conf将下面的配置追加到 http的最后,然后重启服务brewservicesrestartnginx......
  • PHP.安装SQL SERVER 驱动
    01.取phpinfo信息; 02.登陆网址,查对应版本的文件下载:https://learn.microsoft.com/en-us/sql/connect/php/release-notes-php-sql-driver?view=sql-server-ver16#previous-releases下载文件后,将文件解压到任何指定的目录;按01步骤的内容,直接取驱动文件,如:03.将文件拷......