PHP GD:黑底透明
PHP GD: Black background transparent
我的问题是图片是透明的(它应该是透明的)但是 "blend mode" 所在的部分仍然有点黑,但不应该是。
- 图 1:
- 图 2:
- 图 3:
和输出
你可以在输出中看到黄色部分周围的小黑圈。
我的代码:
$dst = imagecreatetruecolor(1000, 1000);
imagefill($dst, 0, 0, imagecolorallocatealpha($dst, 0, 0, 0, 127));
foreach ($images as $value) {
// IMPROVE!
$value[1] = (500 - $value[1]);
$value[2] = (500 - $value[2]);
$src = imagecreatefrompng("result/$value[0].png");
imagealphablending($src, false);
imagesavealpha($dst, true);
// BLEND MODE
imagecolortransparent($src, imagecolorat($src, 0, 0));
imagecopy($dst, $src, $value[1], $value[2], 0, 0, imagesx($src), imagesy($src));
imagedestroy($src);
}
$dst = imagecropauto($dst, IMG_CROP_DEFAULT);
imagepng($dst, sprintf('images/64/%s_%d.png', $name, $rotation));
imagedestroy($dst
所以希望大家帮帮忙!
你好。
"image 3" 是屏幕混合图像。
由于GD库中没有函数,请自行制作或使用ImageMagick。
使用 GD 的每个像素的示例混合代码:
$src = imagecreatefrompng("result/$value[0].png");
$rgba = imagecolorat($src, 0, 0);
$color = imagecolorsforindex($src, $rgba);
//2-type blend mode
if($color['alpha'] == 0){
//no-alpha image, Screen Blend
for($y = $value[2]; $y < imagesy($dst); $y++){
if($y - $value[2] > imagesy($src) - 1) break;
if($y < 0) continue;
for($x = $value[1]; $x < imagesx($dst); $x++){
if($x - $value[1] > imagesx($src) - 1) break;
if($x < 0) continue;
$rgb_dst = imagecolorat($dst, $x, $y);
$colors_dst = imagecolorsforindex($dst, $rgb_dst);
$rgb_src = imagecolorat($src, $x - $value[1], $y - $value[2]);
$colors_src = imagecolorsforindex($src, $rgb_src);
$r = $colors_dst['red'] + $colors_src['red'] - ($colors_dst['red'] * $colors_src['red']) / 255;
$g = $colors_dst['green'] + $colors_src['green'] - ($colors_dst['green'] * $colors_src['green']) / 255;
$b = $colors_dst['blue'] + $colors_src['blue'] - ($colors_dst['blue'] * $colors_src['blue']) / 255;
$alpha = $colors_dst['alpha'];
imagesetpixel($dst, $x, $y, imagecolorallocatealpha($dst, $r, $g, $b, $alpha));
}
}
}else{
//legacy
imagealphablending($src, false);
imagecolortransparent($src, imagecolorat($src, 0, 0));
imagecopy($dst, $src, $value[1], $value[2], 0, 0, imagesx($src), imagesy($src));
}
imagedestroy($src);
结果:
result image
我的问题是图片是透明的(它应该是透明的)但是 "blend mode" 所在的部分仍然有点黑,但不应该是。
- 图 1:
- 图 2:
- 图 3:
和输出
你可以在输出中看到黄色部分周围的小黑圈。
我的代码:
$dst = imagecreatetruecolor(1000, 1000);
imagefill($dst, 0, 0, imagecolorallocatealpha($dst, 0, 0, 0, 127));
foreach ($images as $value) {
// IMPROVE!
$value[1] = (500 - $value[1]);
$value[2] = (500 - $value[2]);
$src = imagecreatefrompng("result/$value[0].png");
imagealphablending($src, false);
imagesavealpha($dst, true);
// BLEND MODE
imagecolortransparent($src, imagecolorat($src, 0, 0));
imagecopy($dst, $src, $value[1], $value[2], 0, 0, imagesx($src), imagesy($src));
imagedestroy($src);
}
$dst = imagecropauto($dst, IMG_CROP_DEFAULT);
imagepng($dst, sprintf('images/64/%s_%d.png', $name, $rotation));
imagedestroy($dst
所以希望大家帮帮忙!
你好。
"image 3" 是屏幕混合图像。 由于GD库中没有函数,请自行制作或使用ImageMagick。
使用 GD 的每个像素的示例混合代码:
$src = imagecreatefrompng("result/$value[0].png");
$rgba = imagecolorat($src, 0, 0);
$color = imagecolorsforindex($src, $rgba);
//2-type blend mode
if($color['alpha'] == 0){
//no-alpha image, Screen Blend
for($y = $value[2]; $y < imagesy($dst); $y++){
if($y - $value[2] > imagesy($src) - 1) break;
if($y < 0) continue;
for($x = $value[1]; $x < imagesx($dst); $x++){
if($x - $value[1] > imagesx($src) - 1) break;
if($x < 0) continue;
$rgb_dst = imagecolorat($dst, $x, $y);
$colors_dst = imagecolorsforindex($dst, $rgb_dst);
$rgb_src = imagecolorat($src, $x - $value[1], $y - $value[2]);
$colors_src = imagecolorsforindex($src, $rgb_src);
$r = $colors_dst['red'] + $colors_src['red'] - ($colors_dst['red'] * $colors_src['red']) / 255;
$g = $colors_dst['green'] + $colors_src['green'] - ($colors_dst['green'] * $colors_src['green']) / 255;
$b = $colors_dst['blue'] + $colors_src['blue'] - ($colors_dst['blue'] * $colors_src['blue']) / 255;
$alpha = $colors_dst['alpha'];
imagesetpixel($dst, $x, $y, imagecolorallocatealpha($dst, $r, $g, $b, $alpha));
}
}
}else{
//legacy
imagealphablending($src, false);
imagecolortransparent($src, imagecolorat($src, 0, 0));
imagecopy($dst, $src, $value[1], $value[2], 0, 0, imagesx($src), imagesy($src));
}
imagedestroy($src);
结果: result image