Page 1 of 3

How to know the image's transparent space?

Posted: 2019-06-19T16:17:15-07:00
by niyanwen
If I have in image, which has transparent space, is there a way I can know the transparent space starts from x and y? basically like this image boundary?

Re: How to know the image's transparent space?

Posted: 2019-06-19T16:41:23-07:00
by fmw42
Please always identify your IM version and platform and post your input and output images to some free hosting service and put the URLs here so we can see what you are trying to do.

Just check the pixel color at your desired coordinate.

Code: Select all

convert image -format "%[pixel:u.p{x,y}]" info:
If the alpha value is less than 1, it has some transparency there.

Example:

Code: Select all

convert logo: -transparent white -format "%[pixel:u.p{10,10}]" info:
none
none means the same as perfectly transparent

Note that logo: is an internal ImageMagick images. Replace that with your image in the form, imagename.suffix

This does not tell you that it starts there, just that that pixel is transparent.



To find the first fully transparent pixel in the image in row/column format, you can do that in ImageMagick by extracting the alpha channel and using identify.

For example, I take the logo: image and make white transparent. Then I extract the alpha channel and negate it so that transparency is represented as white rather than black. Then just for fun, I add a 10 pixel black border, so that the first white pixels will be at 10,10. Then, I use identify.

Code: Select all

convert logo: -transparent white -alpha extract -negate -bordercolor black -border 10x10 x.png
identify -precision 5 -define identify:locate=maximum -define identify:limit=1 x.png
Channel maximum locations:
Red: 65535 (1) 10,10
Green: 65535 (1) 10,10
Blue: 65535 (1) 10,10

So all channels are brightest (maximum value) at 10,10

Re: How to know the image's transparent space?

Posted: 2019-06-20T11:11:51-07:00
by niyanwen
Hi

thanks for your answer, I want to explain a little, so I have an image to print using some printer
I want to get this image boundary and exclude transparency. since printer needs to know image boundary

another thought I have, could I use trim function to trim the transparency of this image, and calculate the image boundaries with original image size?
like that,

IMOperation op = new IMOperation();
op.add(image);

op.bordercolor("none");
op.border(1,1);

op.trim();
op.p_repage();

Re: How to know the image's transparent space?

Posted: 2019-06-20T13:59:34-07:00
by fmw42
If you want to trim all transparency on the outside, then see the new -define for trim.

Use -define trim:percent-background=0% to remove all the background from the image. Example

input:
Image

Code: Select all

magick img.png -fuzz 5% -background black -alpha background -define trim:percent-background=0% -trim +repage img_atrim.png
Image

Re: How to know the image's transparent space?

Posted: 2019-06-22T12:07:43-07:00
by niyanwen
Hi,

after revisiting my use case, I think what I need is
this is original picture https://m.media-amazon.com/images/G/01/ ... IMAGE1.png
I want to know know x, y direction basically need to know left boundary, and top boundary which don't have transparency
in here top boundary is 583 and left boundary is 555

then I need to trim these transparency, now my question is how can I know top boundary and left boundary using image magick

Re: How to know the image's transparent space?

Posted: 2019-06-22T13:07:34-07:00
by fmw42
use

Code: Select all

convert SHIRT_ART_IMAGE1.png -format "%@" info:
3390x3004+555+593

That will give you the trim coordinates WxH+Xoff+Yoff. The Xoff and Yoff are the top left corner where it would have been trimmed to get rid of transparency. So the coordinates you want, I think, are 555,593

Re: How to know the image's transparent space?

Posted: 2019-06-22T16:01:29-07:00
by niyanwen
wow, great, thank you so much!

Re: How to know the image's transparent space?

Posted: 2019-06-22T16:26:32-07:00
by fmw42
You can trim and get the coordinates at the same time.

Code: Select all

convert SHIRT_ART_IMAGE1.png -format "%@" +write info: -trim +repage SHIRT_ART_IMAGE1_trim.png
3390x3004+555+593

But you also get the trimmed image.

Re: How to know the image's transparent space?

Posted: 2019-06-22T17:03:49-07:00
by niyanwen
when I trim it, can I add some padding there, for example, have a padding 5 around the border when trim it?

Re: How to know the image's transparent space?

Posted: 2019-06-22T17:11:03-07:00
by fmw42

Code: Select all

convert SHIRT_ART_IMAGE1.png -format "%@" +write info: -trim +repage -bordercolor none -border 5 SHIRT_ART_IMAGE1_trim.png

Re: How to know the image's transparent space?

Posted: 2019-06-22T17:36:00-07:00
by niyanwen
thanks, question for my own learning, for printing purpose, we only need to know top, left boundary, which is x, y and we don't need to know right, and bottom boundary right?

Re: How to know the image's transparent space?

Posted: 2019-06-22T20:58:53-07:00
by fmw42
Sorry, I do not know much about printing issues. But I think you need to know the width and height as well.

Re: How to know the image's transparent space?

Posted: 2019-06-26T12:58:34-07:00
by niyanwen
Hi

something might be related, I also want to detect if this image is fully transparent, is there anything I can tell from this output, or I need to do it before running this command? for if it is transparent, I don't need to trim it

Re: How to know the image's transparent space?

Posted: 2019-06-26T14:06:17-07:00
by niyanwen
basically can I assume if output xOffset == src.getWidth() && yOffset == 0, sec is the original image before trim, I can say this image is total transparent?

Re: How to know the image's transparent space?

Posted: 2019-06-26T14:38:43-07:00
by fmw42
niyanwen wrote: 2019-06-26T14:06:17-07:00 basically can I assume if output xOffset == src.getWidth() && yOffset == 0, sec is the original image before trim, I can say this image is total transparent?
No, you cannot. It could be transparent somewhere in the middle.

So if you care about transparency anywhere in your image, then you need to test the alpha channel to see if its average (mean) is fully opaque value of 1 with a %[fx:mean] evaluation.

Code: Select all

convert image -channel a -separate -format "%[fx:mean]" info:
A value less than 1 will indicate that there is some transparency somewhere in the image.

You can do it also as

Code: Select all

convert image -channel a -separate -format "%[fx:mean<1?1:0]" info:
If it returns 1, it has some transparency. If it returns 0, it is fully opaque