×

php

PHP创建透明图片,解决图片水印后或是缩小后变形颜色差异

天外来信 天外来信 发表于2021-10-27 11:57:09 浏览951 评论0

抢沙发发表评论

如何使用PHP创建一个空白透明的图片?

<?php
$STYLE = [0 => ['width' => 800, 'height' => 800, 'style' => 'bg_1.png', 'bgcolor' => 'bg_1.jpg', 'fontx' => 0, 'fonty' => 0, 'fontcolor' => '#FFFFFF', 'fontsize' => 24, 'qrx' => 650, 'qry' => 650, 'qrwidth' => 100], 2 => ['width' => 1000, 'height' => 1000, 'style' => 'bg_2.png', 'bgcolor' => '#ffffff', 'fontx' => 240, 'fonty' => 17, 'fontcolor' => '#FFFFFF', 'fontsize' => 20, 'qrx' => 45, 'qry' => 805, 'qrwidth' => 170], 99 => ['width' => 800, 'height' => 800, 'style' => '', 'bgcolor' => '#ffffff7f', 'fontx' => 230, 'fonty' => 60, 'fontcolor' => '#000000', 'fontsize' => 24, 'qrx' => 800, 'qry' => 800, 'qrwidth' => 100]];
$bgcolor = $STYLE[$config['style']]['bgcolor'];
if (substr($bgcolor, 0, 1) == '#') {
    $im = imagecreatetruecolor($STYLE[$config['style']]['width'], $STYLE[$config['style']]['height']);
    if (strlen($bgcolor) > 8) {
        imagealphablending($im, false);
        //这里很重要,意思是不合并颜色,直接用$img图像颜色替换,包括透明色;
        imagesavealpha($im, true);
        //这里很重要,意思是不要丢了$thumb图像的透明色;
        $bg_color = imagecolorallocatealpha($im, hexdec(substr($bgcolor, 1, 2)), hexdec(substr($bgcolor, 3, 2)), hexdec(substr($bgcolor, 5, 2)), hexdec(substr($bgcolor, 7, 2)));
    } else {
        $bg_color = imagecolorallocate($im, hexdec(substr($bgcolor, 1, 2)), hexdec(substr($bgcolor, 3, 2)), hexdec(substr($bgcolor, 5, 2)));
    }
    imagefill($im, 0, 0, $bg_color);
    imagepng($im, $tmpbgpic);
    imagedestroy($im);
} else {
    copy(root_path() . 'config/picstyle/' . $bgcolor, $tmpbgpic);
}


遇到在做透明图片缩略图时,发现图片压缩后,图片颜色变了。后来查PHP文档看到这句话:

注意:

因为调色板图像限制(255+1 种颜色)有个问题。重采样或过滤图像通常需要多于 255 种颜色,计算新的被重采样的像素及其颜色时采用了一种近似值。对调色板图像尝试分配一个新颜色时,如果失败我们选择了计算结果最接近(理论上)的颜色。这并不总是视觉上最接近的颜色。这可能会产生怪异的结果,例如空白(或者视觉上是空白)的图像。要跳过这个问题,请使用真彩色图像作为目标图像,例如用 imagecreatetruecolor() 创建的。


评论列表

访客