繁体   English   中英

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

[英]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个平铺图像的数据集可以使用。

到目前为止的过程

  1. 我已经映射了original.jpeg图像,将其切成5px x 5px的图块,然后找到了每个图块的平均颜色并将其保存以备将来使用。
  2. 我已经扫描了所有(10x10)平铺图像,并存储了它们各自的平均颜色。
  3. 我已经通过使用Weighted ref: 所述站点的欧几里得距离来计算出哪个瓷砖图像最适合原始图像的哪个瓷砖。
  4. 我设法使用PHP gd库创建了一个新的truecolor图像,并将所有匹配的图块放置在正确的位置(从而有效地创建了original.jpeg图像的马赛克)

问题

我没有得到我所期望的清晰马赛克,由于某种原因,瓷砖无法正确匹配。

解决方法

现在由于时间不足,我正在使用一种快速修复方法,在该方法中,我拍摄原始图像,使其具有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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM