PHP 要截圖可以參考此篇:PHP 要截圖片的某個區塊(截圖)
上述截圖的圖片是方形的,想要截出圓形的圖片,要怎麼做呢?
註:此篇文章的需要透明背景,所以還是以 png 為主。
PHP 截出 圓形(橢圓形)的圖片
要裁切出圓形的圖片,參考此篇文章下面有畫出圓形圖片的範例連結,在這邊除了那些會用到的 Function 外,會額外需要下述幾個函式庫:
- imagecolorat() - 取得指定 pixel 的顏色
- imagecolorsforindex() - 將 imagecolorat() 得值轉為 RGB 的色碼
正常截圖是無法截成圓形,只能裁成方形,然後裡面再切出圓形,其它周圍畫成透明底色。
作法如下述:
- 圖片載入
- 截圖(方形)
- 畫出圓形圖片(將圓形設定為透明),可參考此篇:PHP 要畫圓形參考此篇:PHP 畫出 透明背景 的 圓形 圖片程式
- 蓋上圖片(此時外框是有顏色的,但是裁切出來的圓形蓋上去,就會是裁切成圓形的圖片)
- 抓取圖片外框的顏色(因為蓋上去,顏色就不會是原本的顏色,需要取的兩張圖合併後的顏色)
- 畫出圓形圖片(跟第三步驟的圖片一致,指定第五步驟的顏色為背景,並將背景設定為透明)
- 將截出來的圖蓋到第六步驟的圖片即可
範例,將此圖片切成下述圖片:
原圖
挑選 640x427 的尺寸下載,裁切完成的圖片,然後放在背景是黃色背景的網頁,截圖如下:
註:網頁原始碼:
- <html><body>
- <style>
- body {background:yellow;}
- img {border:1px solid #000;}
- </style>
- <img src="http://example.com/crop-circle.php">
- </body></html>
裁切成圓形圖片的程式(crop-circle.php)
- <?php
- header("Content-type:image/png");
- // 圖1 200x200 的黑色圓圈圖形,將黑色圓圈設為透明
- $im = imagecreatetruecolor(200,200);
- $white = imagecolorallocate($im, 255, 255, 255);
- $black = imagecolorallocate($im, 0, 0, 0);
- imagefill($im, 0, 0, $white);
- imagefilledellipse($im, 100, 100, 200, 200, $black); // 黑色的圓
- // 先把中間設為透明,然後再蓋過去(現在四個角為白色)
- imagecolortransparent($im, $black);
- // 圖2
- // 將要裁切的圖先抓進來,然後用上面 中間透明部分的圖蓋上去,四個角就為白色
- $dest = imagecreatefrompng('source.png'); // 要被切的圖
- $newim = imagecreate(200, 200);
- imagecopyresampled($newim, $dest, 0, 0, 180, 70, 200, 200, 200, 200);
- // ex: imagecopyresampled($newim, $dest, 0, 0, 100, 150, 1024, 768, 200, 200); // 從 100(x), 150(y) 的地方開始裁切 1024x768 再轉成 200x200
- imagecopymerge($newim, $im, 0, 0, 0, 0, 200, 200, 100);
- // 取得背景顏色 (左上角0, 0)
- $color_index = imagecolorat($newim, 0, 0);
- $color = imagecolorsforindex($newim, $color_index); // [r,g,b]
- // 圖3 200x200 的黑色圓圈圖形,將黑色圓圈四角特定為透明
- // 再生一張,將四個角設定為透明即可 (跟最上面一張一樣,但是只有設定最外面四角為透明)
- $im = imagecreatetruecolor(200,200);
- $bg = imagecolorallocate($im, $color['red'], $color['green'], $color['blue']);
- $black = imagecolorallocate($im, 0, 0, 0);
- imagefill($im, 0, 0, $bg);
- imagefilledellipse($im, 100, 100, 200, 200, $black); // 黑色的圓
- imagecolortransparent($im, $bg);
- // 將圖2的圖蓋到圖3上面來,就會是四角透明的狀態
- imagecopymerge($im, $newim, 0, 0, 0, 0, 200, 200, 100);
- imagepng($im);
- imagedestroy($newim);
- imagedestroy($im);
- imagedestroy($dest);
- ?>