类
GdkPixbufPixbuf
描述 [src]
final class GdkPixbuf.Pixbuf : GObject.Object
implements Gio.Icon, Gio.LoadableIcon {
/* No available fields */
}
像素缓冲区。
GdkPixbuf
包含有关图像的像素数据、色彩空间、每样本位数、宽度和高度以及行距(一行起始处与下一行起始处之间的字节数)的信息。
创建新的 GdkPixbuf
创建 Pixbuf 最基本的方式是用 GdkPixbuf
实例将现有的像素缓冲区封装起来。你可以使用 gdk_pixbuf_new_from_data()
函数执行此操作。
每次为某些数据创建新的 GdkPixbuf
实例时,你都需要指定一个销毁通知函数,该函数将在数据缓冲区需要释放时调用;这将在引用计数函数将某个 GdkPixbuf
设为 finalized 时发生。如果你有静态数据编译到你的应用程序中,你可以将 NULL
传入销毁通知函数,以便不会释放该数据。
可以将 gdk_pixbuf_new()
构造函数用作一种便利的方式,通过它可以创建具有空缓冲区的 Pixbuf;这相当于使用 malloc()
分配数据缓冲区,然后用 gdk_pixbuf_new_from_data()
将其封装起来。gdk_pixbuf_new()
函数将计算出最优的行距,以便可以使用一种高效的算法来执行渲染。
作为一个特例,你可以使用 gdk_pixbuf_new_from_xpm_data()
函数从内联 XPM 图像数据创建一个 Pixbuf。
你还可以使用 gdk_pixbuf_copy()
函数复制现有的 Pixbuf。这与仅仅获取旧 Pixbuf 实例的引用不同:复制函数实际上会复制内存中的像素数据,并为其创建一个新的 GdkPixbuf
实例。
引用计数
GdkPixbuf
结构是引用计数结构。这意味着应用程序可以在代码的多个部分中共享单个 Pixbuf。当程序的一部分需要使用 Pixbuf 时,应该通过调用 g_object_ref()
来获取它的引用;当不再需要 Pixbuf 时,它应该通过调用 g_object_unref()
来释放所获取的引用。与 GdkPixbuf
关联的资源将在其引用计数变为零时释放。新创建的 GdkPixbuf
实例的引用计数初始值为一。
图像数据
Pixbuf 中的图像数据以未压缩打包格式存储在内存中。其中的图像行从上到下存储,每行中的像素从左到右存储。
行末可能存在填充。
通过 gdk_pixbuf_get_rowstride()
返回的 Pixbuf 的“行距”值表明行之间的字节数。
提示: 如果使用 memcpy()
复制原始 pixbuf 数据,请注意 pixbuf 中的最后一行可能不会像完整的行步宽那么宽,而只像像素数据的需要宽度一样宽;也就是说:这样做是不安全的 memcpy (dest, pixels, rowstride * height)
来复制整个 pixbuf。改用 gdk_pixbuf_copy()
,或计算最后一行字节的宽度,如下所示
last_row = width * ((n_channels * bits_per_sample + 7) / 8);
对于 GdkPixbuf
像素数组的每一行进行迭代时,也会应用相同的规则。
以下代码展示了具有 alpha 通道的 8 位每通道 RGB pixbuf 的简单 put_pixel()
函数。
static void
put_pixel (GdkPixbuf *pixbuf,
int x,
int y,
guchar red,
guchar green,
guchar blue,
guchar alpha)
{
int n_channels = gdk_pixbuf_get_n_channels (pixbuf);
// Ensure that the pixbuf is valid
g_assert (gdk_pixbuf_get_colorspace (pixbuf) == GDK_COLORSPACE_RGB);
g_assert (gdk_pixbuf_get_bits_per_sample (pixbuf) == 8);
g_assert (gdk_pixbuf_get_has_alpha (pixbuf));
g_assert (n_channels == 4);
int width = gdk_pixbuf_get_width (pixbuf);
int height = gdk_pixbuf_get_height (pixbuf);
// Ensure that the coordinates are in a valid range
g_assert (x >= 0 && x < width);
g_assert (y >= 0 && y < height);
int rowstride = gdk_pixbuf_get_rowstride (pixbuf);
// The pixel buffer in the GdkPixbuf instance
guchar *pixels = gdk_pixbuf_get_pixels (pixbuf);
// The pixel we wish to modify
guchar *p = pixels + y * rowstride + x * n_channels;
p[0] = red;
p[1] = green;
p[2] = blue;
p[3] = alpha;
}
加载图像
GdkPixBuf
类提供了一种简单的机制,用于同步和异步方式从文件中加载图像。
对于 GUI 应用程序,建议使用异步流 API 来避免阻塞应用程序的控制流。
此外,GdkPixbuf
提供 GdkPixbufLoader
API 用于渐进图像加载。
保存图像
GdkPixbuf
类提供了多种文件格式的方法来保存图像数据。格式化数据可以写入文件或内存缓冲区。GdkPixbuf
还可以对数据调用用户定义的回调函数,该回调函数允许例如将图像写入套接字或将其存储在数据库中。
构造函数
gdk_pixbuf_new_from_stream_finish
使用 gdk_pixbuf_new_from_stream_async() 开始的异步 pixbuf 创建操作完成。
since: 2.24
函数
gdk_pixbuf_get_file_info_finish
完成使用 gdk_pixbuf_get_file_info_async() 开始的异步 pixbuf 解析操作。
since: 2.32
gdk_pixbuf_save_to_stream_finish
完成使用 gdk_pixbuf_save_to_stream_async() 启动的异步 pixbuf 保存操作。
since: 2.24
实例方法
gdk_pixbuf_composite_color
创建一个源图像 src
的转换,按照 scale_x
和 scale_y
进行缩放,然后按照 offset_x
和 offset_y
进行平移,然后将结果图像的矩形 (dest_x
、dest_y
、dest_width
、dest_height
) 使用颜色 color1
和 color2
的棋盘格进行 alpha 混合,并将其渲染到目标图像上。
gdk_pixbuf_composite_color_simple
创建一个新 pixbuf,按 dest_width
x dest_height
缩放 src
并使用颜色 color1
和 color2
的棋盘格对结果进行 alpha 混合。
gdk_pixbuf_get_option
在选项列表中查找 key
,这些选项可能已在加载 pixbuf
时附加到 pixbuf
,或者可能已由使用 gdk_pixbuf_set_option() 的其他函数附加。
gdk_pixbuf_get_options
返回一个 GHashTable
,其中列出了所有可能在加载 pixbuf
时附加到 pixbuf
的选项,或者可能已被使用 gdk_pixbuf_set_option()
的其他函数附加。
since: 2.32
gdk_pixbuf_save
以格式type
将pixbuf保存至文件中。默认情况下,“jpeg”、“png”、“ico”和“bmp”是可保存的文件格式,但可能会安装更多的格式。可以通过以下方式确定所有可写格式的列表:。
gdk_pixbuf_scale
通过按 scale_x
和 scale_y
进行缩放,然后按 offset_x
和 offset_y
进行平移,创建来自源图像 src
的转换,然后将结果图像的矩形 (dest_x
, dest_y
, dest_width
, dest_height
) 呈现在目标图像上,替换以前的内容。
从 GIcon 继承的方法 (4)
g_icon_equal
检查两个图标是否相等。
g_icon_hash
获取图标的哈希值。
g_icon_serialize
将 GIcon
序列化到 GVariant
中。可以通过在返回的值上调用 g_icon_deserialize()
来获取同等的 GIcon
。由于序列化尽可能避免使用原始图标数据,因此只有在同一台机器上(而不是通过网络)以及在相同的文件系统命名空间内,才能在进程之间传输 GVariant
的意义。
g_icon_to_string
生成 icon
的文本表示形式,可用于序列化,例如将 icon
传递给不同的进程或将其保存到持久性存储器中。使用 g_icon_new_for_string()
从返回的字符串中获取 icon
。
从 GLoadableIcon 继承的方法 (3)
g_loadable_icon_load
加载可加载图标。有关此函数的异步版本,请参见 g_loadable_icon_load_async()。
g_loadable_icon_load_async
异步加载图标。要完成此函数,请参见 g_loadable_icon_load_finish()。有关此函数的同步、阻塞版本,请参见 g_loadable_icon_load()。
g_loadable_icon_load_finish
完成在 g_loadable_icon_load_async() 中启动的异步图标加载。
信号
信号从 GObject (1) 继承
GObject::notify
通过 g_object_set_property()、g_object_set() 等方式设置其属性值时,将在对象上发出 notify 信号。