3

そこで、PNG ファイルの透明な背景を維持しながら 2 つの画像をマージできる関数を PHP で構築することに着手しました。

function imageCreateTransparent($x, $y) {

    $imageOut = imagecreatetruecolor($x, $y);
    $colourBlack = imagecolorallocate($imageOut, 0, 0, 0);
    imagecolortransparent($imageOut, $colourBlack);
    return $imageOut;
}
    


function mergePreregWthQR($preRegDir, $qrDir){

$top_file = $preRegDir;
$bottom_file = $qrDir;


$top    = imagecreatefrompng($top_file);
$bottom = imagecreatefrompng($bottom_file);

// get current width/height
list($top_width, $top_height) = getimagesize($top_file);
list($bottom_width, $bottom_height) = getimagesize($bottom_file);

// compute new width/height
$new_width = ($top_width > $bottom_width) ? $top_width : $bottom_width;
$new_height = $top_height + $bottom_height;

// create new image and merge
$new = imageCreateTransparent($new_width,$new_height);
imagecopy($new, $bottom, 0, $top_height+1, 0, 0, $bottom_width, $bottom_height);
imagecopy($new, $top, 0, 0, 0, 0, $top_width, $top_height);

$filename = "merged_file.png";

// save to file
imagepng($new, $filename);

}

mergePreregWthQR("file.png", "qr.png");

これにより、2つの画像がマージされ、透明な背景が維持されました。唯一の問題は、マージされた画像の黒色のピクセルが透明になり、このマージの結果がここに表示されることでした> マージされた画像

上の画像はクラゲの画像、下の画像は白以外の背景に画像を配置した場合にのみ表示されるQRコードです。だから、私が確信しているのは、imagecolortransparent($imageOut, $colourBlack);ということです。新しく作成された merged_file.png のすべての黒いピクセルを透明にしますimageCreateTransparent($x, $y) を以下に示すように少し変更して、理論をテストしました。

function imageCreateTransparent($x, $y) {

$imageOut = imagecreatetruecolor($x, $y);
$colourBlack = imagecolorallocate($imageOut, 55, 55, 55);
imagefill ( $imageOut, 0, 0, $colourBlack );

imagecolortransparent($imageOut, $colourBlack);

return $imageOut;

}

したがって、この関数では、画像全体を色 (55、55、55) で塗りつぶし、imagecolortransparent() 関数でこの色を透明に設定しています。これでうまくいき、私の QR コードは本来あるべき姿で表示されます。唯一の問題は、これを迅速で汚いハックと見なしていることです。アップロードされた画像に誰かが色 (55、55、55) を持っていると、透明になりますか? それで、別の解決策が何であるか知りたいですか?ありがとう。

4

1 に答える 1