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

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

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

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

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

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

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

作法如下述:

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

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

原圖

2015.07.18 19.03.49

挑選 640x427 的尺寸下載,裁切完成的圖片,然後放在背景是黃色背景的網頁,截圖如下:

註:網頁原始碼:

  1. <html><body>
  2. <style>
  3. body {background:yellow;}
  4. img {border:1px solid #000;}
  5. </style>
  6. <img src="http://example.com/crop-circle.php">
  7. </body></html>

裁切成圓形圖片的程式(crop-circle.php)

  1. <?php
  2. header("Content-type:image/png");
  3. // 圖1 200x200 的黑色圓圈圖形,將黑色圓圈設為透明
  4. $im = imagecreatetruecolor(200,200);
  5. $white = imagecolorallocate($im, 255, 255, 255);
  6. $black = imagecolorallocate($im, 0, 0, 0);
  7. imagefill($im, 0, 0, $white);
  8. imagefilledellipse($im, 100, 100, 200, 200, $black); // 黑色的圓
  9. // 先把中間設為透明,然後再蓋過去(現在四個角為白色)
  10. imagecolortransparent($im, $black);
  11. // 圖2
  12. // 將要裁切的圖先抓進來,然後用上面 中間透明部分的圖蓋上去,四個角就為白色
  13. $dest = imagecreatefrompng('source.png'); // 要被切的圖
  14. $newim = imagecreate(200, 200);
  15. imagecopyresampled($newim, $dest, 0, 0, 180, 70, 200, 200, 200, 200);
  16. // ex: imagecopyresampled($newim, $dest, 0, 0, 100, 150, 1024, 768, 200, 200); // 從 100(x), 150(y) 的地方開始裁切 1024x768 再轉成 200x200
  17. imagecopymerge($newim, $im, 0, 0, 0, 0, 200, 200, 100);
  18. // 取得背景顏色 (左上角0, 0)
  19. $color_index = imagecolorat($newim, 0, 0);
  20. $color       = imagecolorsforindex($newim, $color_index); // [r,g,b]
  21. // 圖3 200x200 的黑色圓圈圖形,將黑色圓圈四角特定為透明
  22. // 再生一張,將四個角設定為透明即可 (跟最上面一張一樣,但是只有設定最外面四角為透明)
  23. $im = imagecreatetruecolor(200,200);
  24. $bg    = imagecolorallocate($im, $color['red'], $color['green'], $color['blue']);
  25. $black = imagecolorallocate($im, 0, 0, 0);
  26. imagefill($im, 0, 0, $bg);
  27. imagefilledellipse($im, 100, 100, 200, 200, $black); // 黑色的圓
  28. // 將圖2的圖蓋到圖3上面來,就會是四角透明的狀態
  29. imagecopymerge($im, $newim, 0, 0, 0, 0, 200, 200, 100);
  30. imagepng($im);
  31. imagedestroy($newim);
  32. imagedestroy($dest);
  33. ?>

相關網頁

作者: Tsung

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

發表迴響

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