Page 1 of 1
Different quality setting for different areas of an image
Posted: 2013-10-09T18:53:58-07:00
by runeks
I'd like to compress an image heavily, but use a higher quality setting for specific areas of an image, is this possible with ImageMagick?
Re: Different quality setting for different areas of an imag
Posted: 2013-10-09T19:17:03-07:00
by fmw42
You can compress the image multiple times with different settings. Then use masks to composite all the images together.
Or compress the image the least amount and then use -region or -mask to compress further in the desired areas.
see
http://www.imagemagick.org/Usage/compose/#compose
http://www.imagemagick.org/Usage/layers/#convert
http://www.imagemagick.org/script/comma ... php#region
http://www.imagemagick.org/script/comma ... s.php#mask
http://www.imagemagick.org/script/comma ... #clip-mask
If you can clarify further the regions you want to use, then perhaps a better answer with example could be provided.
Re: Different quality setting for different areas of an imag
Posted: 2013-10-09T19:58:34-07:00
by runeks
Thanks! The region I want to be compressed less is the lower right corner:
http://needsmorejpeg.com/i/mry
I was just checking out this site needsmorejpeg.com and the problem is that the watermark is also compressed heavily (since that's the purpose of the site; "more jpeg"), but it kind of makes the watermark useless, since you can't read it.
Re: Different quality setting for different areas of an imag
Posted: 2013-10-09T20:45:09-07:00
by fmw42
Can you provide a link to your orginal input image and the exact region you want to compress less.
Re: Different quality setting for different areas of an imag
Posted: 2013-10-10T07:52:08-07:00
by runeks
fmw42 wrote:Can you provide a link to your orginal input image and the exact region you want to compress less.
Sure. This is the image I want to compress a lot, except for the region described below:
http://i.imgur.com/Zb6r15W.png
And the area I want to compress less is defined by the following rectangle in the above picture (x1,y1,x2,y2): 386,359,493,372
Thanks!
Re: Different quality setting for different areas of an imag
Posted: 2013-10-10T09:58:40-07:00
by fmw42
try this (unix syntax)
convert yourimage \
\( -clone 0 -fill white -colorize 100 -fill black -draw "rectangle 386,359 493,372" -write mpr:image +delete \) \
-mask mpr:image -quality 10 result.jpg
The second line creates a white image with your area marked in black as a mask and saves it to mpr: (in memory format) and deletes the mask from the image chain leaving the copy in memory.
The third line applies the in-memory mask using -mask.
You can change the -quality setting to whatever you want. I use 10 to emphasize the compression for easy visualizing.
In window, remove the the \ from the \( and \) and replace the end of line \ with end of line ^
see
http://www.imagemagick.org/Usage/masking/#write_mask
NOTE: there appears to be some "bleeding" of the higher compression into your region. I believe this is because JPG compression works in blocks of (16?). So you would likely get better results by enlarging your region to multiples of the block size and aligning it on block boundaries. However, if you just make the region large enough to cover full blocks plus an extra block on all sizes as a buffer around the text, it should work without all that effort.
ALTERNATE:
convert yourimage \( -clone 0 -quality 10 \) \
\( -clone 0 -fill white -colorize 100 -fill black -draw "rectangle 386,359 493,372" \) \
-compose over -composite result.jpg
This clones the image and processes it with -quality 10. Then it creates the same mask (but does not write to mpr:). Then it uses the mask to composite the two images together.
Re: Different quality setting for different areas of an imag
Posted: 2013-10-10T10:39:45-07:00
by snibgo
I thought that "-quality" applied only to the saving on an image to a file, and could only apply to the entire image. I didn't think the OP's requirement could be met with IM.
Taking fmw42's alternative command on runeks's image, inserting a "write", Windows syntax:
Code: Select all
%IM%convert ^
Zb6r15W.png ^
( -clone 0 -quality 10 -write r.jpg ) ^
( -clone 0 -fill white -colorize 100 -fill black -draw "rectangle 386,359 493,372" ) ^
-compose over -composite ^
result.jpg
If we could have different compressions across the image, r.jpg and result.jpg would be different. But they are identical, and this remains true for a variety of compression numbers.
Re: Different quality setting for different areas of an imag
Posted: 2013-10-10T11:51:54-07:00
by runeks
The results I get agree with snibgo.
Using this bash script should take the aforementioned example image and compress the right half of the image less than the left half. This doesn't happen, the whole image is compressed with quality=1, seemingly:
Code: Select all
IMG="/home/rune/Desktop/cat-needsmorejpeg.png"
RECT="250,0,500,375"
convert "$IMG" \
\( -clone 0 -fill white -colorize 100 -fill black -draw "rectangle $RECT" -write mpr:image +delete \) \
-mask mpr:image -quality 1 result1.jpg
convert "$IMG" \( -clone 0 -quality 1 \) \
\( -clone 0 -fill white -colorize 100 -fill black -draw "rectangle $RECT" \) \
-compose over -composite result2.jpg
On further though; is this even possible?
As far as I can see, I need to specify two different quantization matrices in the JPEG file, and use a low quality one for the blocks I want compressed the most, and a high quality one for the blocks I want compressed not as much. Is this even allowed for the JPEG format?
Re: Different quality setting for different areas of an imag
Posted: 2013-10-10T12:34:06-07:00
by fmw42
snibgo is correct. So it looks like the only way to do that is with 3 steps, creating a tmp disk low quality jpg, compositing and deleting the tmp jpg afterwards
convert Zb6r15W.png -quality 10 1tmp.jpg
convert Zb6r15W.png 1tmp.jpg \
\( -clone 0 -fill white -colorize 100 -fill black -draw "rectangle 386,359 493,372" \) \
-compose over -composite result3.jpg
rm 1tmp.jpg
Or in two commands as
convert -respect-parenthesis Zb6r15W.png \( -clone 0 -quality 10 +write 1tmp.jpg \) +delete 1tmp.jpg \
\( -clone 0 -fill white -colorize 100 -fill black -draw "rectangle 386,359 493,372" \) \
-compose over -composite result4.jpg
rm 1tmp.jpg
The -respect-parenthesis is to avoid the -quality 10 being used on the original.
Re: Different quality setting for different areas of an imag
Posted: 2013-10-10T12:44:56-07:00
by snibgo
Or in a single command, eg:
Code: Select all
convert ^
Zb6r15W.png ^
( -clone 0 -quality 2 -write r.jpg +delete ) ^
ephemeral:r.jpg ^
( -clone 0 -fill white -colorize 100 -fill black -draw "rectangle 386,359 493,372" -write rm.png ) ^
-compose over -composite ^
-quality 80 ^
result2.jpg
Re: Different quality setting for different areas of an imag
Posted: 2013-10-10T12:51:38-07:00
by fmw42
I was just trying that, even though as I recall Anthony does not like that use of ephemeral, it does work.
You do not need -write rm.png unless you want to save the mask image for review.
My unix command equivalent to before would be
convert -respect-parenthesis yourimage \( -clone 0 -quality 10 +write 1tmp.jpg \) +delete ephemeral:1tmp.jpg \
\( -clone 0 -fill white -colorize 100 -fill black -draw "rectangle 386,359 493,372" \) \
-compose over -composite result4.jpg
You can remove the -respect-parenthesis if you reset a new -quality XX before the output (as in snibgo's command)
Re: Different quality setting for different areas of an imag
Posted: 2013-10-10T13:35:36-07:00
by runeks
Hooray! That totally works. Thanks guys!
Re: Different quality setting for different areas of an imag
Posted: 2013-10-10T13:48:19-07:00
by snibgo
[I included "-write rm.png" so help me see what the desired effect should be. I didn't mean to include that in the suggested solution. Sorry about that.]
Re: Different quality setting for different areas of an imag
Posted: 2013-10-10T16:32:56-07:00
by GreenKoopa
The
jpegtran utility supports "crop 'n' drop". I'm curious if you could achieve smaller files or faster processing.