PHP:Imagecreatefrompng合成透明背景圖片

PHP:Imagecreatefrompng合成透明背景圖片

Imagecreatefrompng的使用方法參見PHP手冊「PHP: imagecreatefrompng」,本文只作一個範例(語句順序是有意義的,最好不要隨意調換,如順序變更產生非預期效果請多嘗試):

描述

將狐狸圖片(含透明度的png圖片)與玫瑰圖片(含透明度的png圖片)合成一張圖。

  • 狐狸圖片:

$image_bottom

  • 玫瑰圖片:
    $image_top

  • 最終合成圖片:
    final image

步驟

  • 創建一個寬328像素、高482像素真彩色圖像並輸出圖像$tmp_img.
$tmp_img_width = 328;
$tmp_img_height = 482;
$tmp_img = imagecreatetruecolor($tmp_img_width, $tmp_img_height);

imagecreatetruecolor(328,482)

  • 保存$tmp圖像的完整 alpha 通道信息
imagesavealpha($tmp_img, true);
  • $tmp_img圖像分配顏色(紅,綠,藍)和alpha。
    alpha的值範圍是0~127,0表示完全不透明,127表示完全透明。本例中所需為透明圖片,因此alpha值為127。
$red = 0;
$green = 0;
$blue = 0;
$alpha = 127;
$trans_colour = imagecolorallocatealpha($tmp_img, $red, $green, $blue, $alpha);
  • $tmp_img圖像的坐標 x,y(圖像左上角為 0,0)處用$trans_colour顏色執行區域填充(即與 x, y 點顏色相同且相鄰的點都會被填充)。imagefill之後原本全黑的圖片變全透明了,此全透明圖片難以顯示,此處略。
$x = 0;
$y = 0;
imagefill($tmp_img, $x, $y, $trans_colour);
  • 由文件bottom.png創建一個新圖像,這個圖片置底。
$image_bottom = Imagecreatefrompng('images/bottom.png');
  • $image_bottom 圖像中坐標從 (0,0) 開始,寬度為328像素,高度為400像素的部分拷貝到 $tmp_img 圖像中坐標為 (0,40) 的位置上。可以使用imagesx()取得圖片寬度,imagesy()取得圖片高度。
imagecopy($tmp_img, $image_bottom, 0, 40, 0, 0, 328, 400);
  • 销毁圖像$image_bottom
Imagedestroy($image_bottom);

至此,底層圖片已完成。

PHP合成透明背景圖片

  • 重複合成$image_bottom的步驟,再上圖的基礎上往上再壓一個圖層。
$image_top = Imagecreatefrompng('images/top.png');
imagecopy($tmp_img, $image_top, 60, 180, 0, 0, 100, imagesy($image_top));
Imagedestroy($image_top);
  • 以 PNG 格式将图像输出到文件
$filename = 'images/new.png');
imagepng($tmp_img, $filename);
  • 或者將圖像輸出到瀏覽器
header("Content-Type: image/png");
imagepng($tmp_img);
  • 銷毀圖像tmp_img
Imagedestroy($tmp_img);

最終,合成圖片如下:
final image

完整代碼

public function mergeImages(){
        $tmp_img_width = 328;
        $tmp_img_height = 482;
        $tmp_img = imagecreatetruecolor($tmp_img_width, $tmp_img_height);
        imagesavealpha($tmp_img, true);
        $trans_colour = imagecolorallocatealpha($tmp_img, 0, 0, 0, 127);
        imagefill($tmp_img, 0, 0, $trans_colour);
        $image_bottom = Imagecreatefrompng('images/bottom.png');
        imagecopy($tmp_img, $image_bottom, 0, 40, 0, 0, 328, 400);
        Imagedestroy($image_bottom);
        $image_top = Imagecreatefrompng(storage_path('images/top.png');
        imagecopy($tmp_img, $image_top, 60, 180, 0, 0, 100, imagesy($image_top));
        Imagedestroy($image_top);

        //output
        header("Content-Type: image/png");
        imagepng($tmp_img);
        imagedestroy($tmp_img);
        exit;
}
Y Cheung

Y Cheung

Blogger, Programer & Traveler.
Shanghai