PHP:Imagecreatefrompng合成透明背景圖片

Posted by Y Cheung on Thu, Mar 26, 2020

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

Overview

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

狐狸圖片 玫瑰圖片 結果合成圖片
$image_bottom
$image_top
final image

操作步驟

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

imagecreatetruecolor(328,482)

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

至此,底層圖片已完成。

PHP合成透明背景圖片

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

最終,合成圖片如下:

final image

完整代碼

 1public function mergeImages(){
 2        $tmp_img_width = 328;
 3        $tmp_img_height = 482;
 4        $tmp_img = imagecreatetruecolor($tmp_img_width, $tmp_img_height);
 5        imagesavealpha($tmp_img, true);
 6        $trans_colour = imagecolorallocatealpha($tmp_img, 0, 0, 0, 127);
 7        imagefill($tmp_img, 0, 0, $trans_colour);
 8        $image_bottom = Imagecreatefrompng('images/bottom.png');
 9        imagecopy($tmp_img, $image_bottom, 0, 40, 0, 0, 328, 400);
10        Imagedestroy($image_bottom);
11        $image_top = Imagecreatefrompng(storage_path('images/top.png');
12        imagecopy($tmp_img, $image_top, 60, 180, 0, 0, 100, imagesy($image_top));
13        Imagedestroy($image_top);
14
15        //output
16        header("Content-Type: image/png");
17        imagepng($tmp_img);
18        imagedestroy($tmp_img);
19        exit;
20}