PHP GD库-将一个GD半透明图像覆盖在另一个上时发现意外的白点
我已经在这个项目上工作了好几天了,但由于某种原因,我无法消除每一块瓷砖上都会出现的意外的1px×1px(近似值)白点 总结: 我使用原始图像(比如original.jpeg)作为参考,通过合并更小的jpeg图像(大约10px x x 10px),创建一个马赛克图像(比如大约1000px x x 1000px的马赛克.jpeg) 我有一个大约20000个瓷砖图像的数据集要处理 迄今为止的进程PHP GD库-将一个GD半透明图像覆盖在另一个上时发现意外的白点,php,image-processing,gd,Php,Image Processing,Gd,我已经在这个项目上工作了好几天了,但由于某种原因,我无法消除每一块瓷砖上都会出现的意外的1px×1px(近似值)白点 总结: 我使用原始图像(比如original.jpeg)作为参考,通过合并更小的jpeg图像(大约10px x x 10px),创建一个马赛克图像(比如大约1000px x x 1000px的马赛克.jpeg) 我有一个大约20000个瓷砖图像的数据集要处理 迄今为止的进程 我已经映射了原始的.jpeg图像,将其切割成5px×5px的瓷砖,然后找到每个瓷砖的平均颜色,并将其保存以
public function overlay($dImg, $sImg, $opacity = null) {
// set default Opacity if not specified
$opacity = (is_null($opacity)) ? $this->opacity : $opacity;
// get width, height of sourceImage
$sWidth = imagesx($sImg);
$sHeight = imagesy($sImg);
// get width height of final image
$dWidth = imagesx($dImg);
$dHeight = imagesy($dImg);
$image = imagecreatetruecolor($dWidth, $dHeight);
imagecopyresampled($image, $sImg, 0, 0, 0, 0, $dWidth, $dHeight, $sWidth, $sHeight);
$background = imagecolorallocatealpha($image, 255, 255, 255, 127);
imagefill($image, 0, 0, $background);
imagealphablending($image, true);
imagecopymerge($dImg, $image, 0, 0, 0, 0, $dWidth, $dHeight, $opacity);
imagedestroy($image);
return $dImg;
}
真正的问题
理论上,所有这些似乎都很好。但结果在这件事上有自己的发言权
我注意到在最后一幅马赛克的每一块瓷砖的开始处都有一块不寻常的几乎1x1像素的白色补丁
此白色面片仅在应用上述透明度技术时出现。否则就不会发生
我不知道为什么会发生这种情况,由于这个白色补丁,整个图像看起来像是到处都是白噪声,大大降低了整体质量
请告诉我为什么会发生这样的事情。你的问题在于这两条线:
$background = imagecolorallocatealpha($image, 255, 255, 255, 127);
imagefill($image, 0, 0, $background);
您不需要这些,因为imagefill用于填充具有与所提供坐标上的颜色相同/相似颜色的区域,在您的情况下为0,0(左上角),当没有相邻的相似颜色时,它只更改给定坐标处的颜色
您可以使用imagefilledrectangle,但我仍然认为您不需要,只需注释掉这两行,然后查看结果是否符合您的要求,如果不符合,则继续使用imagefilledrectangle
您的问题在于以下两方面:
$background = imagecolorallocatealpha($image, 255, 255, 255, 127);
imagefill($image, 0, 0, $background);
您不需要这些,因为imagefill用于填充具有与所提供坐标上的颜色相同/相似颜色的区域,在您的情况下为0,0(左上角),当没有相邻的相似颜色时,它只更改给定坐标处的颜色
您可以使用imagefilledrectangle,但我仍然认为您不需要,只需注释掉这两行,然后查看结果是否符合您的要求,如果不符合,则继续使用imagefilledrectangle
是的,你是对的。我一直在尝试不同的组合。拆下这两条线可以去除斑点。谢谢你的回复。:)是否有一本好书或PDF或文档可供我理解GD中的每个函数的实际功能?我使用PHP.net库文档和一些谷歌搜索创建了这些函数。我正在使用一些函数进行反复试验,但并没有真正理解它应该做什么。我并没有关于PHP的PDF文档,但若我被某些东西卡住了,我会查看PHPs函数参考,从那个里我得到了imagefilledrectangle,是的,你们是对的。我一直在尝试不同的组合。拆下这两条线可以去除斑点。谢谢你的回复。:)是否有一本好书或PDF或文档可供我理解GD中的每个函数的实际功能?我使用PHP.net库文档和一些谷歌搜索创建了这些函数。我正在使用一些函数进行反复试验,但并没有真正理解它应该做什么。我并没有关于PHP的PDF文档,但若我被某些东西卡住了,我会查看PHPs函数参考,从那个里我得到imagefilledrectangle,