依據圖片有沒有透明的狀態決定剪裁方式 / Trimming Image based on Alpha Channel
之前在「剪裁圖片的白色邊緣,但保留物件的白色」那篇有提到,如果圖片本身就有透明的部分,原本的做法會讓圖片內的透明變成白色。要怎麼改它好呢?
裁切多餘的透明 / Trim transparent parts of an image
先來張圖。這張圖的周圍跟頭髮內部都有透明的部分了,讓我們拉大來看看。
可以看到袖子下方是透明的。
但是它的周圍有多餘的透明區域。要怎麼把它裁掉呢?
原本的做法 / 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
周圍多餘的透明區域是裁掉了沒錯。
但是中間的透明區域變成白色了。
正確的指令 / Correct command
在這個例子中,我們只需要將圖片周圍的透明裁掉即可。用ImageMagick的「-trim」可以輕鬆做到這件事情:
convert input.png -trim output.png
裁切結果如上圖所示,可以看到透明的區域只剩下物件本身了。
當然,袖子下面的透明區域依然是保留的。
因此結合上述的用法,我們就要在圖片沒有透明區域的情況下、或是圖片有透明區域的情況下,各別採用不同的做法。
判斷圖片有沒有透明的區域 / Detect alpha channel of an image
https://stackoverflow.com/a/2581516
ImageMagick提供了可以偵測圖片通道的工具,叫做「identify」。感謝msw的說明,用identify偵測通道的做法如下:
identify -format '%[channels]' input.png
用這張圖片做分析,結果會是「srgba」。其中的a表示透明通道。
用這張圖片做分析,結果會是「srgb」。沒有a,表示這張圖片沒有透明的部分。因此我們就可以用有沒有「a」來判斷要用那個指令了。
Docker App
https://github.com/pulipulichen/docker-app-Image-Trim
這段整合我已經寫在docker-app-Image-Trim裡面了,直接用即可。
文章最後的問題是:你通常需要裁剪那些圖片呢?
在留言舉個例子吧!