Once you have rescaled the image, you can read out the result through the functions:
gboolean lqr_carver_scan( | LqrCarver * carver, |
gint* x, | |
gint* y, | |
guchar** rgb) ; |
or
gboolean lqr_carver_scan_ext( | LqrCarver * carver, |
gint* x, | |
gint* y, | |
void** rgb) ; |
Here, x
and y
are pointers to the varaibles which will
hold the pixel coordinate, while rgb
is a pointer to an array which will
contain the pixel colour information. If the carver was created using the standard 8-bit constructor
lqr_carver_new
, the first form can be used, otherwise you must use the extended
form lqr_carver_scan_ext
. In this last case, the output pointer
rgb
must be passed as a pointer to void*, but the outcome should
actually be cast to a pointer to an array of the appropriate type, depending on the LqrCarver
colour depth.
The return value is FALSE
when the end of the image is reached, or the buffer has the wrong
number of bits, TRUE
otherwise.
Each time these functions are invoked, they will store the coordinates and rgb information in the
output pointers and move to the next pixel. If they reach the end, they reset the reader and return
FALSE
.
Here is a sample code usage:
Example 2.1. A simple readout example
gint x, y; guchar *rgb; while (lqr_carver_scan (carver, &x, &y, &rgb) { my_plot (x, y, rgb[0], rgb[1], rgb[2]); }
In this example, it is assumed that the image has three 8-bit colour channels, and that there exist
some function my_plot
which writes out the pixels somewhere.
The same readout example with different colour depth would read like this:
Example 2.2. A simple readout example - extended version
gint x, y; void *rgb; gdouble *rgb_out; while (lqr_carver_scan (carver, &x, &y, &rgb) { rgb_out = (gdouble*) rgb; my_plot (x, y, rgb_out[0], rgb_out[1], rgb_out[2]); }
In this example it is assumed that the carver was loaded with the LQR_COLDEPTH_64F
as the
colour_depth
argument in the constructor
lqr_carver_new_ext
, and that it has 3
colour channels (see
the constructor section for details); therefore, the output is
cast to type gdouble before using it.
The rgb
array is owned by to the carver object, so it doesn't need
initialization, as in the example. Indeed, it must be used for read-only purposes, and the
content should always be copyed after each call to a scan function.
The image can also be read one line at a time, but it is not possible to freely decide if it is to be read by row or by column. Instead, this has to be queried by calling this function:
gboolean lqr_carver_scan_by_row( | LqrCarver* carver) ; |
The function returns TRUE
if the image is read by row, and FALSE
if it is read by
column.
Then, the image can be read through these functions:
gboolean lqr_carver_scan_line( | LqrCarver* carver, |
gint* n, | |
guchar** rgb) ; |
or
gboolean lqr_carver_scan_line_ext( | LqrCarver* carver, |
gint* n, | |
void** rgb) ; |
These functions work exactly the same way as lqr_carver_scan
and
lqr_carver_scan_ext
, but only one coordinate is stored (either the row or the
column number), and the rgb
array will contain a whole line.
Here is a sample code usage for the standard 8-bit case:
Example 2.3. Line-by-line readout example
gint n; guchar *rgb; gboolean by_row; by_row = lqr_carver_scan_by_row (carver); while (lqr_carver_scan_line (carver, &n, &rgb) { by_row ? my_plot_row (n, rgb) : my_plot_col (n, rgb); }
where, as before, it is assumed that the my_plot_row
and
my_plot_col
functions have been previously defined and "know what to do".
The extended version for images with more colour depth is very similar, it only requires an additional cast:
Example 2.4. Line-by-line readout example - extended version
gint n; void *rgb; guchar *rgb_out; gboolean by_row; by_row = lqr_carver_scan_by_row (carver); while (lqr_carver_scan_line_ext (carver, &n, &rgb) { rgb_out = (gboolean*) rgb; by_row ? my_plot_row (n, rgb_out) : my_plot_col (n, rgb_out); }