How to convert PNG to 8-bit PNG using PHP GD library

前端 未结 2 1486
耶瑟儿~
耶瑟儿~ 2020-12-31 19:27

I want to write a routine which takes PNG image path as parameter and convert that image into 8-bit PNG image. I need to use PHP GD library for this.

相关标签:
2条回答
  • 2020-12-31 20:23

    Instead of GD library I strongly recommend using pngquant 1.5+ commandline using exec() or popen() functions.

    GD library has very poor-quality palette generation code.

    Same image as in the other answer, same file size as GD library, but converted using pngquant to merely 100 colors (not even 256):

    enter image description here

    pngquant supports alpha transparency very well.

    0 讨论(0)
  • 2020-12-31 20:24

    To convert any PNG image to 8-bit PNG use this function, I've just created

    function convertPNGto8bitPNG ()

     function convertPNGto8bitPNG ($sourcePath, $destPath) {
    
         $srcimage = imagecreatefrompng($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);
    
         imagepng($img, $destPath);
         imagedestroy($img);
    
     }
    

    Parameters

    • $sourcePath - Path to source PNG file
    • $destPath - Path to destination PNG file

    Note

    I recommend to make sure that $sourcePath exists and $destPath is writable before running this code. Maybe this function won't work with some transparent images.

    Usage

    convertPNGto8bitPNG ('pfc.png', 'pfc8bit.png');
    

    Example (original -> 8-bit)

    (Source: pfc.png) ORIGINAL PNG IMAGE

    enter image description here

    (Destination: pfc8bit.png) CONVERTED PNG IMAGE (8-bit)

    enter image description here

    Hope someone finds this helpful.

    0 讨论(0)
提交回复
热议问题