PHP GD库-将一个GD半透明图像覆盖在另一个上时发现意外的白点

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的瓷砖,然后找到每个瓷砖的平均颜色,并将其保存以

我已经在这个项目上工作了好几天了,但由于某种原因,我无法消除每一块瓷砖上都会出现的意外的1px×1px(近似值)白点

总结: 我使用原始图像(比如original.jpeg)作为参考,通过合并更小的jpeg图像(大约10px x x 10px),创建一个马赛克图像(比如大约1000px x x 1000px的马赛克.jpeg)

我有一个大约20000个瓷砖图像的数据集要处理

迄今为止的进程
  • 我已经映射了原始的.jpeg图像,将其切割成5px×5px的瓷砖,然后找到每个瓷砖的平均颜色,并将其保存以供进一步使用
  • 我扫描了所有(10x10)瓷砖图像,并存储了它们各自的平均颜色
  • 我已经通过使用所提到的站点中的加权ref:计算出哪个图块图像最适合原始图像的哪个图块
  • 我已经设法使用PHP gd库创建了一个新的truecolor图像,将所有匹配的瓷砖放置在正确的位置(从而有效地创建了原始.jpeg图像的马赛克)
  • 问题 我没有得到一个清晰的马赛克,我曾期待,由于某种原因,瓷砖不匹配正确

    解决办法 现在,由于时间不够,我使用了一个快速修复方法,在将原始图像放入最终马赛克时,给它50%的不透明度,并将其覆盖在每个瓷砖的顶部

    注意:虽然我有效地将原始图像覆盖在马赛克图像上,但我并不是一次性完成的。必须在每个瓷砖层上进行覆盖

    简言之:在将每个瓷砖放置在最终马赛克的正确位置之前,我要做以下工作 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;
    }
    
    真正的问题 理论上,所有这些似乎都很好。但结果在这件事上有自己的发言权

    我注意到在最后一幅马赛克的每一块瓷砖的开始处都有一块不寻常的几乎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,