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); ?>