dump newbie image questiosn

J. Landman Gay jacque at hyperactivesw.com
Mon Jun 6 17:55:52 EDT 2005


On 6/6/05 2:37 PM, Jon wrote:
 >
 > J. Landman Gay wrote:
 >
 > <snip>
 >
 >> No, I wasn't joking. I'm not even sure I understand the problem
 >> because I've never seen it. I always scale images by calculating the
 >> desired dimensions and setting the image to that size. For example, if
 >> I want an image to display at 1/3 its natural size, I do this:
 >>
 >> set the width of img 1 to round((the formattedwidth of img 1) * .3)
 >> set the height of img 1 to round((the formattedheight of img 1) * .3)
 >>
 >
 > This is great if you know in advance that there is enough room to
 > display the image in this way, at this particular scale.  What I wanted
 > was something that automatically displayed the image at the largest
 > resolution possible in "the available space".  That's where the
 > confusion comes in: I need to store the "available space" somewhere in
 > the Image object if I am to perform the computations properly.  Maybe it
 > is just that simple, at least for me.

I don't usually store "available space", I just recalculate it on the 
fly. There is almost always a point of reference available to do that.

For example, you mentioned you have a stack with some buttons at the top 
and the entire lower section available for an image. Or at least, I will 
assume that for this example. In that case, your reference points are:

the available width is equal to the width of the card
the available height is equal to the height of the card minus the bottom 
of your row of buttons, and probably minus a small amount for a margin 
between the button row and the top of the image.

So your script can do this:

put the width of this cd into tW
put the height of this cd - the bottom of btn "aTopRowButton" \
   - 20 into tH

You may want to subtract a bit more from the height calculation so that 
you have more space between the button row and the top of the image you 
are about to put in there. I have left a 20-pixel margin. You may also 
not want the image butted up against the sides of the card, so you could 
subtract some more from the width to account for a margin there too if 
you want. Now you have the available space for an image. Then you add 
the image to the card while the screen is locked so that the resizing 
won't be noticed. Like this:

lock screen
set the filename of img 1 to <path to image>

Or you could use "put url <whatever> into img 1" if you want the image 
to be stored directly in the stack itself. The above method uses a 
referenced image, pulled from disk on the fly. Referenced images keep 
your stack size smaller on disk, but you run a higher risk the files 
will become separated from the place the script expects to find them. 
You can decide which way you want to use.

Now get the formatted dimensions, and use them to calculate the ratio of 
the resizing that is required, depending on whether the width or the 
height fits best:

put the formattedheight of img 1 into tFHt
put the formattedwidth of img 1 into tFWd
put max(tH/tFHt, tW/tFWd) into tRatio
set the height of img 1 to tFHt*tRatio
set the width of img 1 to tFWd*tRatio

And that's it. If you need to, set the final location of the image, 
because resizing it may have moved it slightly:

set the loc of img 1 to <whatever> -- or you could set the "topleft"

Here it is all together (watch for line wrap):

*****

put the width of this cd into tW
put the height of this cd - the bottom of btn "aTopRowButton" \
    - 20 into tH
lock screen
set the filename of img 1 to <path to image>)
put the formattedheight of img 1 into tFHt
put the formattedwidth of img 1 into tFWd
put max(tH/tFHt, tW/tFWd) into tRatio
set the height of img 1 to tFHt*tRatio
set the width of img 1 to tFWd*tRatio
set the topleft of img 1 to (0,the bottom of btn "aTopRowButton" + 20)
unlock screen

*****

I think that does what you want. No need to alter the lockloc of the 
image (which should remain true.) Works cross-platform. ;)

Yes?

-- 
Jacqueline Landman Gay         |     jacque at hyperactivesw.com
HyperActive Software           |     http://www.hyperactivesw.com


More information about the use-livecode mailing list