2009-07-29 33 views
40

我有一堆高質量的PNG文件。我想使用PHP將它們轉換爲JPG,因爲它的文件尺寸較小,同時保持質量。我想在網上顯示JPG文件。使用PHP將PNG轉換爲JPG壓縮?

PHP是否有函數/庫來做到這一點?質量/壓縮質量好嗎?

+6

請注意,根據圖像的不同,JPG並不總是比PNG文件大小小,所以請確保您使用的是正確的文件。 http://lbrandy.com/blog/2008/10/my-first-and-last-webcomic/ – jimyi 2009-07-29 17:27:05

回答

56

小心你想要轉換的東西。 JPG不支持alpha透明,而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()功能。

+9

請看看danLeon的答案,以便安全地將PNG轉換爲JPG。 – Codemole 2012-08-28 02:31:55

+4

這個答案不適用於帶有透明度的png文件。 – 2013-09-18 13:29:35

4

你可能想看看Image Magick,通常被認爲是事實上的圖像處理標準庫。是否需要安裝額外的PHP模塊,但不知道是否有/可用於默認安裝。

HTH。

9

這是一個小例子,將轉換「image.png」到「image.jpg的」在70%的圖像質量:

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

希望幫助

2

我知道這是不是一個確切的回答OP,但作爲答案已經給出...

你真的需要在PHP中做到這一點?
我的意思是:如果你需要轉換大量的圖片,在PHP做它可能不是最好的辦法:你會面臨一場memory_limitmax_execution_time ...

我也想說GD可能無法爲您帶來最佳質量/尺寸比例;但不知道這一點(如果你GD和其他解決方案之間的比較,我對結果;-)很感興趣)

另一種方法,不使用PHP,是通過命令行使用Image Magick (而不是作爲一個PHP擴展像其他人建議)

你必須寫一個shell腳本,通過所有.png文件去,並讓他們要麼

  • convert創建一個新的.jpg e ach .png文件
  • mogrify直接在原始文件上工作並覆蓋它。


一點題外話:如果您在生產服務器上直接這樣做,你可以把轉換的束之間的一些睡眠時間,讓它冷靜下來有時^^


我已經使用+ convert/mogrify幾次(有他們這樣的事情10小時一次運行) shell腳本,他們做的工作非常好:-)

9
<?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);

+1

我用這個,它工作得很好,謝謝! – user1053263 2012-03-17 04:20:51

120

這樣做是爲了安全的一個PNG轉換爲JPG與白色的透明度。

$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);