[英]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.