簡體   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