Page 1 of 1

Convert/ Caption- Working out whether to resize text

Posted: 2010-03-22T15:40:32-07:00
by sambessey
Hi,

I have a convert command I am running to write some text using "caption:" . The actual caption to be written, and the font size to be used is fed in via an HTML form which is submitted to ImageMagick. The image size is fixed. The text must always fit in the given image size. If the text overflows the image, then we must automatically 'best-fit' the text.

What I cannot figure out is how I should be handling the decision of whether or not to perform a resize.
The only way I can see is to do a 'test' where we write an image out with the user's desired text, (with fixed width but variable height), then after writing it/ blobbing it, we measure the height of the image. If it is less than the height of the 'fixed' image, we can just do what the user wants (i.e. use their given font size and text, and stick to our set image size). If the image comes out too tall, then we know the text is too big, and we run a different command which will auto- resize the text.

Obviously, the above is very expensive on CPU time... There must be a better way of doing it! Any help greatly appreciated.

Thanks

Re: Convert/ Caption- Working out whether to resize text

Posted: 2010-03-22T16:17:24-07:00
by fmw42
I think that is just what you have to do.

The only other way is to set the image size for caption: (both width and height) and let IM find the best font size to fit into those dimensions by leaving out -pointsize. Add -gravity center and it should center it the best it can, if I am not mistaken

Re: Convert/ Caption- Working out whether to resize text

Posted: 2010-03-22T16:56:37-07:00
by sambessey
Thanks

Unfortunately the user can control the vertical alignment too, so that's a non- starter- thanks though.

Re: Convert/ Caption- Working out whether to resize text

Posted: 2010-03-22T18:31:17-07:00
by fmw42
i believe that you can add -geometry to -gravity in order to adjust the alignment. any way just a thought to try. But I may be mistaken and those controls may only work with -annotate.

Re: Convert/ Caption- Working out whether to resize text

Posted: 2010-03-23T03:09:38-07:00
by snibgo
Add -geometry center and it should center it the best it can, if I am not mistaken
You mean, I assume, "-gravity center". Yes, -gravity works with caption.
i believe that you can add -geometry to -gravity in order to adjust the alignment.
"-geometry" doesn't work for me with "caption", but "-extent" does. For example, this places text 100 pixels right and 500 pixels down, compared to the same command without "-extent".

Code: Select all

convert -size 1920x1080 ^
  -gravity North   -extent -100-500 ^
  -background Red   -fill "#000080" ^
  -strokewidth "2" -stroke white ^
  -font Verdana -density 96 -pointsize 56 ^
  caption:@capt.txt   capt.png

Re: Convert/ Caption- Working out whether to resize text

Posted: 2010-03-23T13:58:41-07:00
by sambessey
The user can adjust the text both vertically and horizontally, and I only want to do something in the event that the user writes text that it too big to fit in the box.

Thanks

Re: Convert/ Caption- Working out whether to resize text

Posted: 2010-03-23T15:06:52-07:00
by fmw42
snibgo wrote:
Add -geometry center and it should center it the best it can, if I am not mistaken
You mean, I assume, "-gravity center". Yes, -gravity works with caption.
Yes, thanks. corrected above now.

Re: Convert/ Caption- Working out whether to resize text

Posted: 2010-03-23T15:10:45-07:00
by fmw42
As I said before, you can set the image size for caption: (both width and height) and let IM find the best font size to fit into those dimensions by leaving out -pointsize. That is pretty much equivalent to setting the pointsize and then resizing afterwards as the pointsize will get effectively smaller. Not sure why this is not acceptable to you. You can even use -gravity to adjust it north, center, or south aligned.

Otherwise, I cannot suggest anything else to do.

For more elaborate adjustments, you can use -annotate on a second pass after you find out how big your resulting image will be and resize if necessary. The redraw with -annotate

Re: Convert/ Caption- Working out whether to resize text

Posted: 2010-03-23T15:24:33-07:00
by sambessey
Hi fmw,

I fully understand what you are saying, but if the user can choose the font size, vertical and horz. alignment, but the overall dimensions of the image are fixed (and the text is specified by the user too).

The problem is I want to accommodate the user's chosen font size where possible, but when not possible, I need to invoke an auto resize, to stop the text overflowing. IM does not return anything when the text overflows the image dimensions. If IM could somehow return something if the output overflowed, then there would be no problem, as I could listen for this, capture it, and act on it.

What you are suggesting is simply the solution I want to come up with to invoke a resize- not actually help in making the decision whether to invoke a resize or not.

Even if I could count the number of wraps IM will do on the string, I could work out whether it is likely to overflow and invoke auto- resize, but I can't do this either.

Thanks

Re: Convert/ Caption- Working out whether to resize text

Posted: 2010-03-23T15:28:36-07:00
by fmw42
I don't think you understand. IM will keep the font size from causing overflow if you specify the image size in width AND height but leave off the pointsize. It will find the pointsize that will just fill the specified size. This is equivalent to specifying the width and pointsize and getting a larger height and then having to resize to get the height as you might want it, which will make the pointsize smaller just as my method would do in the end. If you still need to adjust the position, either make the width and/or height smaller to accomodate your movement or resize. But my way will not overflow.

see http://www.imagemagick.org/Usage/text/#caption_bestfit

Re: Convert/ Caption- Working out whether to resize text

Posted: 2010-03-23T16:17:23-07:00
by sambessey
I fully understand your point, however:

Imagine an HTML form linked to ImageMagick and two extreme scenarios.....

A) If the user can choose point size 36 and then write 50 lines into a box that is 200x100 pixels, it is clearly going to overflow, right?

B) If the user chooses point size 36 and writes the letter 'a' in the same box, it will not overflow, right?

IF I leave the command as- is (so point size 36 is allowed), how do I know when the text is going to overflow (i.e. in the first situation) and remove the pointsize from the ImageMagick command to prevent overflow (and invoke auto- fit text)? ImageMagick outputs nothing to indicate that the text has overflowed.

I know HOW to prevent it overflowing and HOW to not prevent it overflowing, I just cannot find a method to choose WHETHER (not HOW) to put limits on the text overflow.... In scenario A), I need to prevent an overflow by removing the font size, in scenario 2, I do not... How can I tell when that overflow is about to happen?

Thanks

Re: Convert/ Caption- Working out whether to resize text

Posted: 2010-03-23T16:47:51-07:00
by fmw42
This is the only way I know to do it. You have to virtually create the image and test its height.

Note don't specify height in caption command.

This is unix. If on windows, see http://www.imagemagick.org/Usage/windows/

width=100
height=100
psize=24
hh=`convert -background blue -fill white -font Helvetica -size ${width}x \
-pointsize $psize caption:"this is a test message that might overflow" miff:- |\
convert - -format "%h" info:`
[ $hh -gt $height ] && echo "overflow" || echo "no overflow"

Re: Convert/ Caption- Working out whether to resize text

Posted: 2010-03-23T17:07:15-07:00
by snibgo
There might be a shortcut available by calling MagicWand from a custom program, but I can't see a quicker way using commands. It needs two passes: first to try at the user-requested pointsize, then (if necessary) let IM choose a smaller size.

I don't think there is any way to tell the first pass to give up as soon as it determines it needs more than a pre-determined height, or to tell it to use the largest pointsize it can, but capped at the user-defined size.