:::

依據圖片有沒有透明的狀態決定剪裁方式 / Trimming Image based on Alpha Channel

2023-0420-115047.png

之前在「剪裁圖片的白色邊緣,但保留物件的白色」那篇有提到,如果圖片本身就有透明的部分,原本的做法會讓圖片內的透明變成白色。要怎麼改它好呢?


裁切多餘的透明 / Trim transparent parts of an image

00184-284591921.png

先來張圖。這張圖的周圍跟頭髮內部都有透明的部分了,讓我們拉大來看看。

2023-0420-113447.png

可以看到袖子下方是透明的。

2023-0420-114044.png

但是它的周圍有多餘的透明區域。要怎麼把它裁掉呢?

原本的做法 / Previous command

如果是用「白色背景變透明,但是保留物件的白色」這篇的做法,那用以下指令裁切的結果,會讓中間的透明區域變成白色:

convert input.png -alpha set -bordercolor white -border 1 -fill none -fuzz 3% -draw "color 0,0 floodfill" -shave 1x1 -trim output.png

output2.png

周圍多餘的透明區域是裁掉了沒錯。

2023-0420-115503.png

但是中間的透明區域變成白色了。

正確的指令 / Correct command

在這個例子中,我們只需要將圖片周圍的透明裁掉即可。用ImageMagick的「-trim」可以輕鬆做到這件事情:

convert input.png -trim output.png

output.png

裁切結果如上圖所示,可以看到透明的區域只剩下物件本身了。

2023-0420-114152.png

當然,袖子下面的透明區域依然是保留的。

因此結合上述的用法,我們就要在圖片沒有透明區域的情況下、或是圖片有透明區域的情況下,各別採用不同的做法。

判斷圖片有沒有透明的區域 / Detect alpha channel of an image

https://stackoverflow.com/a/2581516

ImageMagick提供了可以偵測圖片通道的工具,叫做「identify」。感謝msw的說明,用identify偵測通道的做法如下:

identify -format '%[channels]' input.png 

00184-284591921.png

用這張圖片做分析,結果會是「srgba」。其中的a表示透明通道。

whiteShirt_1.jpg

用這張圖片做分析,結果會是「srgb」。沒有a,表示這張圖片沒有透明的部分。因此我們就可以用有沒有「a」來判斷要用那個指令了。

Docker App

https://github.com/pulipulichen/docker-app-Image-Trim

https://github.com/pulipulichen/docker-app-Image-Trim

這段整合我已經寫在docker-app-Image-Trim裡面了,直接用即可。


文章最後的問題是:你通常需要裁剪那些圖片呢?

在留言舉個例子吧!