Hi,
I'm hacking together a kiosk-style user interface for a local non-profit. As many of the users are elderly, much is done with images/pictures instead of text (small display means you can't put much text there
*and* have it remain legible to "older eyes")The images for each "button" (no need to be precise, here) are stored in an RDBMS. Based on the operator's actions, the screen is updated with new choices (images, etc.).
Updates need to be reasonably quick lest the user grow impatient with the interface.
The kiosk is implemented as a think client -- scarce resources on the user end of the wire.
I can trade memory (in the RDBMS) and transit time (over the network) for processing power in the client (*or* server).
So, one approach is to convert JPEGs (the images originate as pictures captured from digital cameras, scanners, etc.) into PNGs, BMPs, etc. as they are being imported to the RDBMS. (i.e., a one-time event). This makes the images a bit larger (so what! space on the server can be nearly infinite) to store. And, means screen updates will potentially require more data to be sent down the wire than a more compressed encoding would require. But, that doesn't seem (on paper) to be an issue. Plenty of bandwidth.
An uncompressed format also eases the processing requirements for the client (e.g., wireless devices).
However, uncompressed formats imply a particular "resolution". So, rescaling the display on the user interface poses problems. Now the client would need to scale the image to the desired screen size (for example). For a dozen images, this can represent a significant amount of processing -- in a *short* period of time (300ms tends to be the threshold for annoyance in a user interface -- that 300ns has to encompass the round trip transit time to access the RDBMS server, the time it takes the server to fetch the images and transfer them back to the client, the time it takes the client to resize them, plus the time it takes for the client to build the new display and any other client-side processing).
One possible solution is MS's "DIB" approach. That increases the storage requirements on the server even more (not a concern at this time) and means the client needs to either specify the version it wants (in the SQL query *or* at the start of its *session* -- which would therefore prevent resizing the user interface during a session!) from the RDBMS
*or* the RDBMS must ship the entire DIB to te client and let the client extract the most appropriate image.This doesn't work if you want to support *arbitrary* resizing.
Another approach is to have a server side filter that resizes the image as requested (in the SQL query) prior to delivering the reply. This can exploit the extra processing power available on the server -- on the assumption that clients are greater in number, simpler in capability and sporadic in access. Alternatively, the sizing can be established when the session begins so SQL queries can be unconcerned with this detail (again, means resizing is not possible during a session. Also means you have to know a priori what the relationships of the sizes of each will be *and* maintain this regardless of how the composition of the UI changes from device to device!)
Yet another approach is to resize *all* images in the RDBMS in a "session-specific" instance (VIEW) associated with that client when the session begins. This can be a *big* performance hit as it could mean hhundreds of images get resized -- even though few of them may ever be "served up". OTOH, it would give the ideal steady-state performance. And, be portable across clients.
As always, there is no clear winner. Have other folks done anything like this? Or, any *desktop* technology worth looking into for hints?
Thanks!
--don