そこで、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) を持っていると、透明になりますか? それで、別の解決策が何であるか知りたいですか?ありがとう。