[英]PHP GD library - Unexpected white spots found on overlaying one gd semi-transparent image over the other
我已经在这个项目上工作了几天,由于某种原因,我无法摆脱每个处理过的图块中出现的意外的1px x 1px(大约)白点。
我正在使用原始图像(例如original.jpeg)作为参考,通过合并更大得多的jpeg图像(aprox 10px x 10px)来创建马赛克图像(例如mosaic.jpeg大约为1000px x 1000px)。
我有大约20,000个平铺图像的数据集可以使用。
我没有得到我所期望的清晰马赛克,由于某种原因,瓷砖无法正确匹配。
现在由于时间不足,我正在使用一种快速修复方法,在该方法中,我拍摄原始图像,使其具有50%的不透明度,然后将其放置在最终马赛克中时将其覆盖在每个图块的顶部。
注意:尽管我有效地将原始图像覆盖在了马赛克图像上,但我暂时没有做到这一点。 叠加HAS发生在每个图块级别。
简而言之:在将每个图块放置在最终镶嵌图的正确位置之前,我需要执行以下操作:1.获取原始图像的特定部分(5x5px)2.展开以匹配最终图块大小(10x10px)3.设置第4部分的透明度。将其放置在将要放置的图块上。5.将此新图块在相应位置的最终镶嵌图上合并。
这是我创建的用于覆盖部分图像以及为其设置透明度的功能。
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;
}
从理论上讲,所有这些似乎都很好。 但是结果在这件事上有自己的发言权。
我在最终马赛克的每个图块的开头都注意到了一个不寻常的近1x1px白色补丁。
仅当应用上述透明度技术时,才会出现此白色补丁。 否则不会发生。
对于为什么会这样,我一无所知。由于有白色斑点,整个图像看起来像整个表面都有白噪声,极大地降低了整体质量。
请就任何可能发生这种情况的方向指导我。
您的问题在于以下两行:
$background = imagecolorallocatealpha($image, 255, 255, 255, 127);
imagefill($image, 0, 0, $background);
您不需要这些,因为imagefill用于使用提供的坐标上的颜色填充具有相同/相似颜色的区域,在您的情况下为0、0(左上),如果没有相邻的相似颜色,则它只是改变给定坐标的颜色。
您可以改用imagefilledrectangle ,但我仍然认为您不需要,只需注释掉这两行,然后查看结果是否符合您的要求,否则请继续使用imagefilledrectangle
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.