Imagecreatefrompng的使用方法參見PHP手冊「PHP: imagecreatefrompng」,本文只作一個範例(語句順序是有意義的,最好不要隨意調換,如順序變更產生非預期效果請多嘗試).
Overview
將狐狸圖片(含透明度的png圖片)與玫瑰圖片(含透明度的png圖片)合成一張圖。
狐狸圖片 | 玫瑰圖片 | 結果合成圖片 |
---|---|---|
![]() |
![]() |
![]() |
操作步驟
- 創建一個寬328像素、高482像素真彩色圖像並輸出圖像
$tmp_img
.
1$tmp_img_width = 328;
2$tmp_img_height = 482;
3$tmp_img = imagecreatetruecolor($tmp_img_width, $tmp_img_height);
- 保存
$tmp
圖像的完整 alpha 通道信息
1imagesavealpha($tmp_img, true);
- 為
$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);
- 在
$tmp_img
圖像的坐標 x,y(圖像左上角為 0,0)處用$trans_colour
顏色執行區域填充(即與 x, y 點顏色相同且相鄰的點都會被填充)。imagefill之後原本全黑的圖片變全透明了,此全透明圖片難以顯示,此處略。
1$x = 0;
2$y = 0;
3imagefill($tmp_img, $x, $y, $trans_colour);
- 由文件
bottom.png
創建一個新圖像,這個圖片置底。
1$image_bottom = Imagecreatefrompng('images/bottom.png');
- 將
$image_bottom
圖像中坐標從 (0,0) 開始,寬度為328像素,高度為400像素的部分拷貝到$tmp_img
圖像中坐標為 (0,40) 的位置上。可以使用imagesx()
取得圖片寬度,imagesy()
取得圖片高度。
1imagecopy($tmp_img, $image_bottom, 0, 40, 0, 0, 328, 400);
- 销毁圖像
$image_bottom
1Imagedestroy($image_bottom);
至此,底層圖片已完成。
- 重複合成
$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);
- 以 PNG 格式将图像输出到文件
1$filename = 'images/new.png');
2imagepng($tmp_img, $filename);
- 或者將圖像輸出到瀏覽器
1header("Content-Type: image/png");
2imagepng($tmp_img);
- 銷毀圖像
tmp_img
1Imagedestroy($tmp_img);
完整代碼
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}