web-dev-qa-db-ja.com

PHPを使用して、PNGを圧縮してJPGに変換しますか?

高品質のPNGファイルがたくさんあります。 PHPを使用して、品質を維持しながらファイルサイズを小さくするために、それらをJPGに変換します。JPGファイルをWeb上に表示したいと思います。

PHPにはこれを行う関数/ライブラリがありますか?品質/圧縮は良いですか?

48
John

これを行うと、PNGを安全に白の透明度に変換できます。

$image = imagecreatefrompng($filePath);
$bg = imagecreatetruecolor(imagesx($image), imagesy($image));
imagefill($bg, 0, 0, imagecolorallocate($bg, 255, 255, 255));
imagealphablending($bg, TRUE);
imagecopy($bg, $image, 0, 0, 0, 0, imagesx($image), imagesy($image));
imagedestroy($image);
$quality = 50; // 0 = worst / smaller file, 100 = better / bigger file 
imagejpeg($bg, $filePath . ".jpg", $quality);
imagedestroy($bg);
165
Daniel De León

変換するものに注意してください。 JPGはアルファ透明度をサポートしませんが、PNGはサポートします。その情報は失われます。

変換するには、次の関数を使用できます。

_// Quality is a number between 0 (best compression) and 100 (best quality)
function png2jpg($originalFile, $outputFile, $quality) {
    $image = imagecreatefrompng($originalFile);
    imagejpeg($image, $outputFile, $quality);
    imagedestroy($image);
}
_

この関数は、Gdライブラリの imagecreatefrompng() および imagejpeg() 関数を使用します。

58
Andrew Moore

これは、70%の画像品質で「image.png」を「image.jpg」に変換する小さな例です。

<?php
$image = imagecreatefrompng('image.png');
imagejpeg($image, 'image.jpg', 70);
imagedestroy($image);
?>

役立つことを願っています

11
Al.
_<?php
function createThumbnail($imageDirectory, $imageName, $thumbDirectory, $thumbWidth) {
    $explode = explode(".", $imageName);
    $filetype = $explode[1];

    if ($filetype == 'jpg') {
        $srcImg = imagecreatefromjpeg("$imageDirectory/$imageName");
    } else
    if ($filetype == 'jpeg') {
        $srcImg = imagecreatefromjpeg("$imageDirectory/$imageName");
    } else
    if ($filetype == 'png') {
        $srcImg = imagecreatefrompng("$imageDirectory/$imageName");
    } else
    if ($filetype == 'gif') {
        $srcImg = imagecreatefromgif("$imageDirectory/$imageName");
    }

    $origWidth = imagesx($srcImg);
    $origHeight = imagesy($srcImg);

    $ratio = $origWidth / $thumbWidth;
    $thumbHeight = $origHeight / $ratio;

    $thumbImg = imagecreatetruecolor($thumbWidth, $thumbHeight);
    imagecopyresized($thumbImg, $srcImg, 0, 0, 0, 0, $thumbWidth, $thumbHeight, $origWidth, $origHeight);

    if ($filetype == 'jpg') {
        imagejpeg($thumbImg, "$thumbDirectory/$imageName");
    } else
    if ($filetype == 'jpeg') {
        imagejpeg($thumbImg, "$thumbDirectory/$imageName");
    } else
    if ($filetype == 'png') {
        imagepng($thumbImg, "$thumbDirectory/$imageName");
    } else
    if ($filetype == 'gif') {
        imagegif($thumbImg, "$thumbDirectory/$imageName");
    }
}
    ?>
_

これは非常に優れたサムネイルスクリプトです=)以下に例を示します。

$ path =元の画像があるフォルダーへのパス。 $ name =サムネイルを作成するファイルのファイル名。 $ thumbpath =サムネイルを保存するディレクトリへのパス。 $ maxwidth = PXのサムネイルの最大幅。 100(100pxになります)。

createThumbnail($path, $name, $thumbpath, $maxwidth);

10
Patrik

Image Magick を調べてください。通常は、画像処理の事実上の標準ライブラリと見なされます。ただし、追加のphpモジュールをインストールする必要がありますが、デフォルトのインストールで使用できるものがあるかどうかはわかりません。

HTH。

4
falstro

PHPには、 imagecreatefrompng および imagejpeg function とともに、いくつかの 画像処理関数 があります。 1つ目はPNG画像ファイルの内部表現を作成し、2つ目はその表現をJPEG画像ファイルとして保存するために使用されます。

3
Gumbo

このPHPイメージライブラリのリスト を参照してください。基本的にはGdまたはImagemagickです。

2
Draemon

私はそれがOPに対する正確な答えではないことを知っていますが、答えはすでに与えられているので...

PHPでこれを本当に行う必要がありますか?
つまり、たくさんの画像を変換する必要がある場合、PHPが最善の方法ではないかもしれません。memory_limitmax_execution_time、 ...

また、Gdはあなたに最高の品質/サイズ比を与えないかもしれないと言うでしょう。しかし、それについてはわかりません(Gdと他のソリューションを比較する場合、結果に非常に興味があります;-))

PHPを使用しない別のアプローチは、コマンドラインで Image Magick を使用することです(PHP他の人が提案した)

すべての.pngファイルを通過するシェルスクリプトを作成し、それらを次のいずれかに渡す必要があります。

  • convert.jpgファイルに対して新しい.pngファイルを作成します
  • または mogrify は、元のファイルを直接操作して上書きします。


注:実稼働サーバーでこれを直接行う場合は、変換の束の間にスリープ時間を入れて、時々少し冷やすことができます^^


シェルスクリプト+ convert/mogrifyを数回使用しました(1回10時間程度実行する) 、そして彼らは本当にうまく仕事をしている:-)

2
Pascal MARTIN