zoukankan      html  css  js  c++  java
  • php修改JPG格式图片的dpi

      最近因为业务需求,需要把一批jpg格式图片的dpi从72改为300,图片有三万张,一个一个用ps搞的话就太难受了,所以想写个脚本批量处理,结合网上的资料搞了半天时间终于弄出来了,脚本跑了10个小时左右把所有图片都处理好了,下面说下我是怎么做的。

      最开始的时候,在想用php自带的gd库能不能处理,在网上搜了一下,找到了一份代码:

      

    function setDPI($filename){
    
        $file = file_get_contents($filename);
    
    //数据块长度为9
        $len = pack("N", 9);
    //数据块类型标志为pHYs
        $sign = pack("A*", "pHYs");
    //X方向和Y方向的分辨率均为300DPI(1像素/英寸=39.37像素/米),单位为米(0为未知,1为米)
        $data = pack("NNC", 300 * 39.37, 300 * 39.37, 0x01);
    //CRC检验码由数据块符号和数据域计算得到
        $checksum = pack("N", crc32($sign . $data));
        $phys = $len . $sign . $data . $checksum;
    
        $pos = strpos($file, "pHYs");
        if ($pos > 0) {
            //修改pHYs数据块
            $file = substr_replace($file, $phys, $pos - 4, 21);
        } else {
            //IHDR结束位置(PNG头固定长度为8,IHDR固定长度为25)
            $pos = 33;
            //将pHYs数据块插入到IHDR之后
            $file = substr_replace($file, $phys, $pos, 0);
        }
    
        file_put_contents($filename,$file);
    }

      试了下这份代码,发现dpi确实变了,但是只能从72dpi变成96dpi,这就很尴尬了。最后在stackoverflow上搜了下,发现都比较推荐使用imagick这个插件。然后大部分时间都花在安装这个插件上了(淦)。下面将说明下怎么安装这个插件。

      

      首先打印出phpinfo,根据自己的php版本,参数下载对应版本的插件,插件下载地址:https://pecl.php.net/package/imagick 或者 https://windows.php.net/downloads/pecl/releases/imagick/,下载好后解压出来,就跟下面的图一样

      然后把php_imagick.dll丢到php的ext文件下

       接着这个解压出来的文件里面还有其他的dll文件,把这些dll后缀的文件(dll后缀的喔)丢到php文件夹里面。

       做完这些,重启下服务,然后打印phpinfo,可以看到扩展已经识别出来了。如果扩展没有识别出来,那检查下电脑环境变量里面的php环境变量是不是跟你装扩展的php版本不一致(我开始的时候忘记了这个事,一直没识别出来)。

      装完php的扩展后,还需要装上ImageMagick这个软件,下载地址是 http://ftp.icm.edu.pl/packages/ImageMagick/binaries/,根据phpinfo里面的提示,找到对应的版本下载,下载dll版的。

       安装完成后,输入magick --version命令,对比下phpinfo里的信息,看是否安装正确。

      

      最后就可以写代码转化图片的dpi了。我是直接写的脚本,如果说要集成进框架里面应该还需要其他的操作。最后呢,代码如下:

    function handleImg($input){
        // if(!is_dir($out_dir)){
        //     mkdir($out_dir,0777,true);
        // }
        $image = new Imagick();
        $image->readImage($input);
        $image->setImageResolution(300,300);
        $image->resampleImage(300,300,imagick::FILTER_UNDEFINED,0);
        $image->writeImage($input);
    }

      input是要处理图片的文件路径,因为因为硬盘空间不够了,我直接把原图片给覆盖了。最后处理出来的效果如下:

      

  • 相关阅读:
    Beginning Python From Novice To Professional读书笔记
    Google's Python Class
    Screen scraping 3
    Screen scraping 1
    Screen scraping 2
    《发现你的销售力量》读书笔记
    不可思议的每日培训
    “项目计划与跟踪最佳实践”讲座(2010年7月)现接受企业申请
    “活用类图,把握需求主动权”讲座(2010年6月)现接受企业申请
    项目健康状况检查
  • 原文地址:https://www.cnblogs.com/zhouyuanpei/p/14177478.html
Copyright © 2011-2022 走看看