2011-03-11 70 views
0

我有一个透明背景和一个白色的圆圈一个PNG图像彩色化PNG图像。我想上色的白圈成一个特定的颜色,但我使用这段代码有困难:使用PHP GD

$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) 

任何建议将是很有益的。先谢谢你。

+0

我相信你忘了描述什么错在这里。你能提供样本输入和输出图像吗? – Charles 2011-03-11 23:06:26

回答

2

你的PNG图像我假设有Alpha透明度,这使得imagecolorset()没用,因为你只是删除透明度(或锯齿边缘结束)。

如果您只有一个圈子,你是最好创建与GD的新形象和绘图您的圆圈imagefilledellipse()

但是,如果“圆”不仅仅是一个圈,你的代码变得非常复杂稍微复杂一些。但是,您可以使用GD抽象库(如WideImage)来显着简化该任务。所以,着色透明的“面具”,你可以简单地做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()imagecolorset()完成。