php修改JPG格式图片的dpi
最近因?yàn)闃I(yè)務(wù)需求,需要把一批jpg格式圖片的dpi從72改為300,圖片有三萬張,一個(gè)一個(gè)用ps搞的話就太難受了,所以想寫個(gè)腳本批量處理,結(jié)合網(wǎng)上的資料搞了半天時(shí)間終于弄出來了,腳本跑了10個(gè)小時(shí)左右把所有圖片都處理好了,下面說下我是怎么做的。
最開始的時(shí)候,在想用php自帶的gd庫能不能處理,在網(wǎng)上搜了一下,找到了一份代碼:
function setDPI($filename){
$file = file_get_contents($filename);
//數(shù)據(jù)塊長度為9
$len = pack("N", 9);
//數(shù)據(jù)塊類型標(biāo)志為pHYs
$sign = pack("A*", "pHYs");
//X方向和Y方向的分辨率均為300DPI(1像素/英寸=39.37像素/米),單位為米(0為未知,1為米)
$data = pack("NNC", 300 * 39.37, 300 * 39.37, 0x01);
//CRC檢驗(yàn)碼由數(shù)據(jù)塊符號和數(shù)據(jù)域計(jì)算得到
$checksum = pack("N", crc32($sign . $data));
$phys = $len . $sign . $data . $checksum;
$pos = strpos($file, "pHYs");
if ($pos > 0) {
//修改pHYs數(shù)據(jù)塊
$file = substr_replace($file, $phys, $pos - 4, 21);
} else {
//IHDR結(jié)束位置(PNG頭固定長度為8,IHDR固定長度為25)
$pos = 33;
//將pHYs數(shù)據(jù)塊插入到IHDR之后
$file = substr_replace($file, $phys, $pos, 0);
}
file_put_contents($filename,$file);
}
試了下這份代碼,發(fā)現(xiàn)dpi確實(shí)變了,但是只能從72dpi變成96dpi,這就很尷尬了。最后在stackoverflow上搜了下,發(fā)現(xiàn)都比較推薦使用imagick這個(gè)插件。然后大部分時(shí)間都花在安裝這個(gè)插件上了(淦)。下面將說明下怎么安裝這個(gè)插件。
首先打印出phpinfo,根據(jù)自己的php版本,參數(shù)下載對應(yīng)版本的插件,插件下載地址:https://pecl.php.net/package/imagick 或者 https://windows.php.net/downloads/pecl/releases/imagick/,下載好后解壓出來,就跟下面的圖一樣
然后把php_imagick.dll丟到php的ext文件下
接著這個(gè)解壓出來的文件里面還有其他的dll文件,把這些dll后綴的文件(dll后綴的喔)丟到php文件夾里面。
做完這些,重啟下服務(wù),然后打印phpinfo,可以看到擴(kuò)展已經(jīng)識別出來了。如果擴(kuò)展沒有識別出來,那檢查下電腦環(huán)境變量里面的php環(huán)境變量是不是跟你裝擴(kuò)展的php版本不一致(我開始的時(shí)候忘記了這個(gè)事,一直沒識別出來)。
裝完php的擴(kuò)展后,還需要裝上ImageMagick這個(gè)軟件,下載地址是 http://ftp.icm.edu.pl/packages/ImageMagick/binaries/,根據(jù)phpinfo里面的提示,找到對應(yīng)的版本下載,下載dll版的。
安裝完成后,輸入magick --version命令,對比下phpinfo里的信息,看是否安裝正確。
最后就可以寫代碼轉(zhuǎn)化圖片的dpi了。我是直接寫的腳本,如果說要集成進(jìn)框架里面應(yīng)該還需要其他的操作。最后呢,代碼如下:
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是要處理圖片的文件路徑,因?yàn)橐驗(yàn)橛脖P空間不夠了,我直接把原圖片給覆蓋了。最后處理出來的效果如下:
總結(jié)
以上是生活随笔為你收集整理的php修改JPG格式图片的dpi的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SAP Fiori Elements S
- 下一篇: 华为助手怎么叫出来