[REBOL] explanation, gurus? :-) (image memory representation)
From: petr::krenzelok::trz::cz at: 21-Aug-2001 0:21
Hi,
I visited today my friend, who helped me to do .dll library in gcc under
Windows. Kind of a pain :-)
We tried to prepare small function for image manipulation. I remember Jeff
stating that the way to allow library space code to access rebol word data
is by using pointer thru structurre ..
(http://rebol.org/userlist/archive/504/457.html )
Because we are trying a little bit to prepare ourselves for our camera, and
data received, we did a small function. We receive primare data in bytes
(binary form), so receiving them thru rebol port, we will get something
like:
->> to-string #{FFFF}
== "ÿÿ"
for FFFF = 65535 pixel value. As we need to convert to RGB, we did it in
following way:
str1 ... our raw image data received from camera in above form
str2 ... preallocated string (we have to use insert/dup to prevent library
crash), of size 3 * (lenght? str1)
len ... length of image data we send into library ...
We found out, that once we send string into library, it is hopefully not
copied (or we think so), but only pointer is received and data is
manipulated directly in 'str1 or 'str2 rebol storage space.
So the result is - our 'str2 contains data "ready" to display ... So now is
the time to convert it to image datatype:
img: make image! reduce [XxY str2]
view layout [image img]
So - it somehow works (or so did our very primitive test example ...)
Now the question is - we have data in display, or let's say - 'img already
exists, and we would like to do something directly in it (e.g. user adjusted
img data by some effect, e.g. brightness). How to easily get the image data
back into string, avoiding copying data?
I came to a little bit ugly aproach :-) mold img, cutted off "#{.....}"
string, loaded it, converted into string, ready to be sent into library once
again. But, with large images, it is sure time consuming aproach :-)
Would using structures help here? Would it allow us to modify image data
directly?
I am a little bit confused by rebol "polymorphism" though:
img: make image! [1x1 #{FFFFFF}]
->> first img
== 255.255.255
->> second img
== 0.255.255
->> third img
== 99.0.255
->> fourth img
== 108.99.0
where do second, third, fourth come from?
What about this one?
img: make image! [10x10 #{FFFFFF}]
== make image! [10x10 #{
FFFFFFCC96CFD8A9CD0000000A00004C96CFE8B0CD0000000A00001C90CF
E8B0CD0000000A0000C4E3D9E8B0CD0000000A000084E...
->> view layout [size 100x100 backdrop img]
Christopher Ross-Gill: loop 20 [probe make image! [1x1]]
courtesy of Chris Ross-Gill, midnight RIM session :-)
Ryan Cole: I: make image! [1x1]
Ryan Cole: >> I: make image! [1x1]
== make image! [1x1 #{00E6E1}]
Ryan Cole: >> I: make image! [1x1]
== make image! [1x1 #{00E7E1}]
Ryan Cole: its different every time.
Ryan Cole: >> i: make image! [1x2 #{FFDDCCBBAA99}]
== make image! [1x2 #{FFDDCCBBAA99}]
->> next i
== make image! [1x2 #{DDCC00AA9900}]
>>
Ryan Cole: The next thing was how next, first and second work on the image
binary data, just by offsetting by one, instead of 3 as you would expect.
courtesy of Ryan Cole :-)
OK, let's hope our Rebol gurus will find some nice explanations ...:-)
Thanks and Cheers,
-pekr-