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是要處理圖片的文件路徑,因為因為硬盤空間不夠了,我直接把原圖片給覆蓋了。最后處理出來的效果如下:
總結
以上是生活随笔為你收集整理的php修改JPG格式图片的dpi的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SAP Fiori Elements S
- 下一篇: SAP Fiori Elements d