php以递归方式改变所有图像的质量

时间:2013-12-31 04:47:48

标签: php image-processing imagemagick

我有一张文件夹照片,上面有不同尺寸和质量的照片。他们都是jpg

我想通过所有这些并将jpg质量降低到80.无需更改尺寸和名称。然后将它们保存到同一文件夹中。

有一种简单的方法吗?

3 个答案:

答案 0 :(得分:1)

如果您使用Linux,这很容易。使用照片在目录中运行以下脚本:

<?php
    shell_exec('for i in *jpg; do convert -quality 80 $i s$i; mv s$i $i; done');
?>

答案 1 :(得分:0)

我正在使用这个功能......

function convertPNGto8bitPNG($ sourcePath,$ destPath){
    $ srcimage = imagecreatefromjpeg($ sourcePath);
    list($ width,$ height)= getimagesize($ sourcePath);
    $ img = imagecreatetruecolor($ width,$ height);
    $ bga = imagecolorallocatealpha($ img,0,0,0,127);
    imagecolortransparent($ img,$ bga);
    imagefill($ img,0,0,$ bga);
    imagecopy($ img,$ srcimage,0,0,0,0,$ width,$ height);
    imagetruecolortopalette($ img,false,255);
    imagesavealpha($ img,true);
    imagejpeg($ img,$ destPath);
    imagedestroy($ IMG);
}

会降低图像质量。

调用此函数:::: convertPNGto8bitPNG('a.jpg','a1.jpg');

在这里你将从a.jpg看到你将在同一文件夹中获得a1.jpg ... 但根据您的要求,图片必须具有相同的名称,您必须使用

convertPNGto8bitPNG('a.jpg','a.jpg');

所以它将取代那张图片......

现在为文件夹中的所有图片编码

     $directory = "img1/";

    //get all image files with a .jpg extension.
    $images = glob($directory . "*.jpg");

    //print each file name
    foreach($images as $image)
    {
      //echo $image;          
      convertPNGto8bitPNG($image, $image);
    }

这里我的目录是img1 ... 你根据你改变了。

所以最终代码为.. ::

函数convertPNGto8bitPNG($ sourcePath,$ destPath){
    $ srcimage = imagecreatefromjpeg($ sourcePath);
    list($ width,$ height)= getimagesize($ sourcePath);
    $ img = imagecreatetruecolor($ width,$ height);
    $ bga = imagecolorallocatealpha($ img,0,0,0,127);
    imagecolortransparent($ img,$ bga);
    imagefill($ img,0,0,$ bga);
    imagecopy($ img,$ srcimage,0,0,0,0,$ width,$ height);
    imagetruecolortopalette($ img,false,255);
    imagesavealpha($ img,true);
    imagejpeg($ img,$ destPath);
    imagedestroy($ IMG);
}

     $directory = "img1/"; // change according to your dorectory name

    //get all image files with a .jpg extension.
    $images = glob($directory . "*.jpg");

    //convert each file
    foreach($images as $image)
    {
      //echo $image;          
      convertPNGto8bitPNG($image, $image);
    }

注意:::我想告诉你的另一件事是你会尝试降低质量而不是图像容量,它会产生空白输出 这个代码运行的手段你必须有高质量的图像 否则你必须提出一些条件

答案 2 :(得分:0)

使用ImageMagick,只需使用mogrify;其中,将覆盖更新质量的现有图像

mogrify -quality 80 *.jpg

如果您正在安装PHP支持Execution Operators,只需将上述命令包装在单引号中即可。

`mogrify -quality 80 *.jpg`

或者只使用Imagick包,如果有的话。

$images = glob('*.jpg');
foreach($images as $image)
{
    $imgObj = new Imagick($image);
    $imgObj->setImageCompressionQuality(80);
    $imgObj->writeImage($image);
}