static guchar*
get_data_from_pixbuf ( GdkPixbuf* pixbuf, GArray* array )
{
guchar *out_data;
GdkColorspace color_space;
gint width;
gint height;
gint rowstride;
gint bits_per_sample;
gint n_channels;
gint last_row_size;
guchar *pixels;
guchar *out;
gboolean has_alpha;
gint r;
/* Get pixbuf properties */
has_alpha = gdk_pixbuf_get_has_alpha ( pixbuf );
color_space = gdk_pixbuf_get_colorspace ( pixbuf );
width = gdk_pixbuf_get_width ( pixbuf );
height = gdk_pixbuf_get_height ( pixbuf );
rowstride = gdk_pixbuf_get_rowstride ( pixbuf );
bits_per_sample = gdk_pixbuf_get_bits_per_sample ( pixbuf );
n_channels = gdk_pixbuf_get_n_channels ( pixbuf );
/* The docs say this is the right way */
last_row_size = width * ((n_channels * bits_per_sample + 7) / 8);
/* According to current docs this should be true and so
* the translation to cogl pixel format below valid */
g_assert ( bits_per_sample == 8 );
if ( has_alpha )
g_assert ( n_channels == 4 );
else
g_assert ( n_channels == 3 );
pixels = gdk_pixbuf_get_pixels ( pixbuf );
out_data = (guchar*) g_malloc ( height * rowstride );
out = out_data;
/* Copy up to last row */
for ( r = 0; r < height - 1; ++ r )
{
memcpy ( out, pixels, rowstride );
pixels += rowstride;
out += rowstride;
}
/* Copy last row */
memcpy ( out, pixels, last_row_size );
return out_data;
}
从pixbuf获取image data
最新推荐文章于 2022-08-01 16:44:01 发布