使用PHP GD着色PNG图像

时间:2011-03-11 22:56:02

标签: php png gd

我有一张带有透明背景和白色圆圈的PNG图像。我正在尝试将白色圆圈着色为特定颜色,但我在使用此代码时遇到了困难:

$src = imagecreatefrompng('circle.png');

$handle = imagecolorclosest($src, 255,255,255);
imagecolorset($src,$handle,100,100,100);

$new_image_name = "new_image.png";
imagepng($src,$new_image_name);
imagedestroy($src)

任何建议都会非常有用。提前谢谢。

1 个答案:

答案 0 :(得分:2)

我假设您的PNG图像具有Alpha透明度,这会使imagecolorset()无用,因为您只需删除透明度(或最终会出现锯齿状边缘)。

如果您只有一个圆圈,最好使用GD创建新图像并使用imagefilledellipse()绘制圆圈。

但是,如果“圆圈”比圆圈稍微复杂一点,那么会使代码变得非常复杂。但是,您可以使用诸如WideImage之类的GD抽象库来简化该任务。因此,要为透明的“蒙版”着色,您只需使用WideImage执行以下操作:

// 1. Load Image
$original = WideImage::load('circle.png');

// 2. Get Transparency Mask
$mask = $original->getMask();

// 3. Dispose Original
$original->destroy();

// 4. Create New Image
$colorized = WideImage::createTrueColorImage($mask->getWidth(), $mask->getHeight());

// 5. Colorize Image
$bg = $colorized ->allocateColor(255, 0, 0);
$colorized->fill(0, 0, $bg);

// 6. Apply Transparency Mask
$colorized->applyMask($mask);

// 7. Dispose mask
$mask->dispose();

// 8. Save colorized
$colorized->save($new_image_name);

// 9. Dispose colorized
$colorized->dispose();

上述9个步骤中的大部分都可以使用GD轻松完成,除了第2步和第6步......它仍然可以通过循环,一些数学以及对imagecolorat()和{{3的大量调用来完成}}