J. Landman Gay wrote:

On 6/5/05 4:33 PM, Jon wrote:

My first learning project was to replicate my Windows image viewer/manipulator in Rev. That ended with some finality when it turned out that Rev runs so slowly that it cannot possibly process all of the pixels in a real image in the time a reasonable user would sit still. Sigh.


You should be able to do this easily, and I know of several image viewers that others have done. It is a trivial task in Revolution, and very fast. There are so many image commands and features that you should never need to manipulate individual pixel data except in the most unusual cases. For a standard image viewer project, never.


My viewer is not a standard viewer. I've implemented a variety of useful features that require that I manage each pixel individually (basically doing custom and complex brightness and contrast stretching). Rev is way too slow to do anything like that.

This is an excellent first-time project. It should be possible to write a simple image viewer in a handful of lines. You can display an image from disk in a single line of Transcript. You can set its size in one more line. What did you need to do exactly? Maybe we can help you finish this.


You can download my Windows image viewer if you root around in www.jonbondy.com a bit if you want to see the features I've implemented. Image sizing is a very difficult thing in Rev: the default seems to be either 1:1 display (which often is too large to fit in the allocated space) or horrible distortion when the image is forced into the limits of the enclosure. I can write software to fix all of this, but I decided to move on to another project (the audio/video player)



I'm now working on a special music/video player, again "porting" it from a Windows implementation. It's almost finished (in the sense that all of the features seem to work at least once!), but needs a lot of cosmetic work and then lots of testing. I am displaying guitar tablature in an image along the bottom of the screen. I want the image to "squeeze" into the given box, but NOT be distorted (a fairly obvious need in my opinion). So, I need to write (or steal!) the logic that figures out which dimension needs to be adjusted, and then adjust it, and then use the LockLoc (what a strange and unintuitive name!) to let it expand to fill the properly proportioned image container.


LockLoc is short for "lock location" and can also be written "locklocation". ;) It overcomes the default behavior of images, which is to automatically expand to fit their image contents.


This is not locking a location; it is altering the image expansion behavior. I find some of this nomenclature to be very bizarre.


When you put an image from disk into an image object, it will automatically resize to fit the image content. If you do not want this behavior, you lock the location (that is, you prevent resizing) by setting the lockLoc to true. When an image is locked this way, its contents will *scale* to fit the image object, rather than the object scaling to fit the image content.


True, but it will scale in both directions, distorting it horribly. This is not useful behavior, unless you want to fill a large space with a small speck of blue. It's ok for backrgounds, not for actual images.



A snippet of code would suffice, although I've written this code enough times that I'm sure I could figure it out again. I am more annoyed that I even have to than anything else.


I have it somewhere but I'd have to go search for it. It isn't too hard though. You just get the width of the available space and the height of the available space, then compare them to see which is larger. Use the largest one to calculate a ratio. Multiply that ratio times the formattedwidth of the image to get the new width; multiply it times the formattedheight of the image to get the new height.

If you can't figure it out, post again and I will go look for it. I can't remember which project I put it in. ;)


Yeah: the logic is straightforward if you work it out. I just feel as if this should be an intrinsic part of images. And I ran into some huge bugs when I accidentally mixed an image with Geometry with an On Resize handler.



The Geometry facility is interesting (and novel to me), but I don't know that it will work at all with the kinds of things I want to do. Because I don't want to distort any images, I will end up altering the shape of the Image object each time an image is loaded.


As per above, if you leave the lockloc of the image object set to false, the image will automatically resize to the native dimensions.


As per above, the image will be impossible to see, since it will be so distorted


Eventually, it will be easy to lose track of the original shape/size of the "container" into which I was trying to stuff the images. There is a concept missing here, I think: we need THREE image sizes (pixel size on disk, size of largest space available on the screen, and actual space used on the screen) rather than the two (first and last, above) that is currently available. I'm spoiled: all of this was available in a single mode property in my previous IDE.


I'm not sure what you are after exactly, but these can all be retrieved.

Pixel size on disk: formattedwidth and formattedheight of the image.

Space available on screen: you'll have to calculate that, or if it is always the same, store it as a constant, a property or a variable, etc.

Actual space used on screen: you can get either the rect of the image, or you can get the width and the height of the image. This represents the actual current size of the image object.


Maybe this is better left as a phone conversation <grin>

Jon

_______________________________________________
use-revolution mailing list
use-revolution@lists.runrev.com
http://lists.runrev.com/mailman/listinfo/use-revolution

Reply via email to