簡體   English   中英

除了使用imagejpeg或imagepng之外,還有更高質量的將PHP圖像資源轉換為jpeg或png的方法嗎?

[英]Is there higher quality way of converting php image resources to jpeg or png besides using imagejpeg or imagepng

轉換為PHP圖像資源之前的圖像

轉換為php資源后的圖像和使用imagepng的png

目前我使用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圖像,您甚至可以查看imagecolorallocatealphahttp://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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM