[英]Is there higher quality way of converting php image resources to jpeg or png besides using imagejpeg or imagepng
目前我使用imagepng將基於原始圖像的圖像資源轉換為png圖像類型。 這被證明比imagejpeg函數為我的jpg創建的質量更高。
但是你可以清楚地看到這兩個函數中的壓縮算法的質量不如Photoshop那樣高。
有誰知道如何獲得更高質量的jpeg? 是否有關於圖像資源格式以及如何將其轉換為jpeg或png的文檔? 如果我有這些信息,我至少可以嘗試實現更好的算法。
//Create image
$im = apppic($filename, $colors);
imagepng($im, "images/app/".rtrim($path_array[$count],"jpeg")."png", 0);
function promopic ($filename, $colors){
if(@imagecreatefromjpeg($filename))
$img = imagecreatefromjpeg($filename);
elseif(@imagecreatefrompng($filename))
$img = imagecreatefrompng($filename);
elseif(@imagecreatefromgif($filename))
$img = imagecreatefromgif($filename);
$width = imagesx($img);
$height = imagesy($img);
$imHeight = 625;
if( $width/$height > 4/5){$imWidth = 800; $imHeight = $height/$width*$imWidth ; }
else { $imWidth = $width/$height*$imHeight; }
$colorWidth = 1200 - $imWidth;
$numColors = count($colors);
$colorHeight = ceil($imHeight/$numColors) - 2;
$imHeight = ceil($imHeight/$numColors)* $numColors - 2;
$im = @imagecreate(1200, $imHeight+50)
or die("Cannot Initialize new GD image stream");
$background_color = imagecolorallocate($im, 250, 250, 250);
$text_color = imagecolorallocate($im, 255, 255, 251);
$blue_color = imagecolorallocate($im, 40, 5, 251);
//Add color boxes
for ($i = 1; $i <= $numColors; $i++) {
$imcolorbox = @imagecreate($colorWidth, $colorHeight);
$rgb = hex2rgb($colors[($i-1)]);
$colorbox_color = imagecolorallocate($imcolorbox, $rgb[0], $rgb[1], $rgb[2]);
$dest_x = 1200-$colorWidth;
$dest_y = ($colorHeight + 2) * ($i-1);
$copy_image = imagecopy($im, $imcolorbox, $dest_x, $dest_y, 0, 0, $colorWidth, $colorHeight);
imagedestroy($imcolorbox);
//imagestring($im, 5, 1075, 2+$dest_y, "Reinvogue.com", $text_color);
//imagestring($im, 5, $imWidth+5, 2+$dest_y, "Reinvogue.com", $text_color);
//imagestring($im, 5, 1050, 17+$dest_y, "Hex: ".$colors[($i-1)], $text_color);
//imagestring($im, 5, 1050, 2+$dest_y, "RGB: ".$rgb[0]." ".$rgb[1]." ".$rgb[2], $text_color);
}
imagestring($im, 5, 10, $imHeight+15, "Powered by the Reinvogue.com Colorway Engine", $blue_color);
$copy_image = imagecopyresampled($im, $img, 0, 0, 0, 0, $imWidth-2, $imHeight, $width, $height);
return $im;
}
這應該創建一個白色背景的高品質圖像:
$im = @imagecreatetruecolor(1200, $imHeight+50)
$white = imagecolorallocate($im, 255, 255, 255);
imagefill($im, 0, 0, $white);
如果您正在使用png圖像,您甚至可以查看imagecolorallocatealpha
( http://www.php.net/manual/en/function.imagecolorallocatealpha.php )
希望這可以幫助。
對於高質量的PNG8,請使用pngquant2
。 PHP的內置libgd fork具有糟糕的調色板轉換。
引用: http : //pngquant.org/php.html
<?php
/**
* Optimizes PNG file with pngquant 1.8 or later (reduces file size of 24-bit/32-bit PNG images).
*
* You need to install pngquant 1.8 on the server (ancient version 1.0 won't work).
* There's package for Debian/Ubuntu and RPM for other distributions on http://pngquant.org
*
* @param $path_to_png_file string - path to any PNG file, e.g. $_FILE['file']['tmp_name']
* @param $max_quality int - conversion quality, useful values from 60 to 100 (smaller number = smaller file)
* @return string - content of PNG file after conversion
*/
function compress_png($path_to_png_file, $max_quality = 90)
{
if (!file_exists($path_to_png_file)) {
throw new Exception("File does not exist: $path_to_png_file");
}
// guarantee that quality won't be worse than that.
$min_quality = 60;
// '-' makes it use stdout, required to save to $compressed_png_content variable
// '<' makes it read from the given file path
// escapeshellarg() makes this safe to use with any path
$compressed_png_content = shell_exec("pngquant --quality=$min_quality-$max_quality - < ".escapeshellarg( $path_to_png_file));
if (!$compressed_png_content) {
throw new Exception("Conversion to compressed PNG failed. Is pngquant 1.8+ installed on the server?");
}
return $compressed_png_content;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.