PHP 截出 圓形(橢圓形)的圖片

PHP 要截圖可以參考此篇:PHP 要截圖片的某個區塊(截圖)

上述截圖的圖片是方形的,想要截出圓形的圖片,要怎麼做呢?

註:此篇文章的需要透明背景,所以還是以 png 為主。

PHP 截出 圓形(橢圓形)的圖片

要裁切出圓形的圖片,參考此篇文章下面有畫出圓形圖片的範例連結,在這邊除了那些會用到的 Function 外,會額外需要下述幾個函式庫:

正常截圖是無法截成圓形,只能裁成方形,然後裡面再切出圓形,其它周圍畫成透明底色。

作法如下述:

  1. 圖片載入
  2. 截圖(方形)
  3. 畫出圓形圖片(將圓形設定為透明),可參考此篇:PHP 要畫圓形參考此篇:PHP 畫出 透明背景 的 圓形 圖片程式
  4. 蓋上圖片(此時外框是有顏色的,但是裁切出來的圓形蓋上去,就會是裁切成圓形的圖片)
  5. 抓取圖片外框的顏色(因為蓋上去,顏色就不會是原本的顏色,需要取的兩張圖合併後的顏色)
  6. 畫出圓形圖片(跟第三步驟的圖片一致,指定第五步驟的顏色為背景,並將背景設定為透明)
  7. 將截出來的圖蓋到第六步驟的圖片即可

範例,將此圖片切成下述圖片:

原圖

2015.07.18 19.03.49

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

相關網頁

作者: Tsung

對新奇的事物都很有興趣, 喜歡簡單的東西, 過簡單的生活.

發表迴響

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料