Page 1 of 1

Crop image into a circle

Posted: 2016-09-16T00:05:22-07:00
by YujianPeng
Hi,
I want to crop a png image into two png images like
Image
Image
Image

How to get the tow images in command line?
Any help appreciated, thanks a lot !

Re: Crop image into a circle

Posted: 2016-09-16T09:32:25-07:00
by GeeMack
YujianPeng wrote:I want to crop a png image into two png images like [...] How to get the tow images in command line?
IMPORTANT: To get the best help you should always let us know which version of ImageMagick you're using and which OS you're working on. That can make a big difference in the actual commands you'll use.

One way to get a transparent hole is to make a clone of your input image, change that clone to transparent, draw a white circle on it where you want the hole to be, and composite it on your input image using the "DstOut" method. Here is a command using Windows syntax that should work with recent versions of IM6 (convert) or IM7 (magick)...

Code: Select all

convert 3-sample.png -alpha on -background none ^
   ( +clone -channel A -evaluate multiply 0 +channel -fill white -draw "ellipse 153,128 57,57 0,360" ) ^
   -compose DstOut -composite circle_out.png
By changing just the compose method, the same idea can be used to keep only the piece you take out of the hole. Make a clone of the image, make the clone transparent, draw a circle on the part you want to keep, and composite it on the input image using the "DstIn" method like this...

Code: Select all

convert 3-sample.png -alpha on -background none ^
   ( +clone -channel a -evaluate multiply 0 +channel -fill white -draw "ellipse 153,128 57,57 0,360" ) ^
   -compose DstIn -composite circle_in.png
In the "-draw" operation, you need to specify the location of the center of the circle like I did with "153,128", and the radius of the circle like I did with "57,57".

To do both of these operations in a single command, you'd start with the input image, make the transparent clone, and put the circle where you want it. Composite them twice, once using the compose method "DstOut" and another time using "DstIn". At that point you have all four images in the stack, so you "-delete" the first and second images which are the input and the mask. That leaves your two modified images which will be the output. That command would look something like this...

Code: Select all

convert 3-sample.png -alpha on -background none ^
   ( +clone -channel A -evaluate multiply 0 +channel -fill white -draw "ellipse 153,128 57,57 0,360" ) ^
   ( -clone 0,1 -compose DstOut -composite ) ^
   ( -clone 0,1 -compose DstIn -composite ) ^
   -delete 0,1 circle.png
IM will name the output files with sequential numbers, so you'll have "circle-0.png" and "circle-1.png".

To change these commands to *nix shell syntax you'll need to replace the continued line carets "^" with backslashes "\" and use backslashes to escape the parentheses like "\(" and "\)". You may also have to tweak another thing or two like change the double quote marks to single quotes.

Re: Crop image into a circle

Posted: 2016-09-17T05:42:30-07:00
by YujianPeng
GeeMack, Thanks for your reply. Your commands work very good for me!
Thanks a lot!