在GdkPixbuf里画矩形
来源:互联网 发布:java局部变量是引用吗 编辑:程序博客网 时间:2024/05/31 19:15
GdkPixbuf可以处理各种图片,它还可以对导入的图片数据进行区域拷贝,反转,旋转等处理,不过,它好像不能进行画直线,画圆等操作,于是我找了一些网上资料,组合实现了一个在GdkPixbuf里画上一个矩形的操作,void PutRect(GdkPixbuf*pixbuf, SDL_Rect rect, gint color)。
用途:有时候传过来一幀图片数据,比如监控软件,并且想让用户在图片上选择区域操作,那就可先通过gdk_pixbuf_new_from_data()将数据导入到GdkPixbuf中,然后在进行以上的画矩形操作后,用gdk_draw_pixbuf画到窗口上,这样就省去上创建透明画布的麻烦,且矩形也不会在视频上不断闪烁。
#include <gtk/gtk.h>
#include <SDL/SDL.h>
void set_pixel_value(GdkPixbuf *pixbuf, int x, int y, int color)
{
guchar *pixel;
guchar *p;
gint channel;
gint rowstride;
if(!pixbuf) return ;
channel = gdk_pixbuf_get_n_channels(pixbuf);
rowstride = gdk_pixbuf_get_rowstride(pixbuf);
pixel = gdk_pixbuf_get_pixels(pixbuf);
p = pixel+y*rowstride+x*channel;
p[0] = (color & 0xFF000000) >>24;
p[1] = (color & 0x00FF0000) >>16;
p[2] = (color & 0x0000FF00) >>8;
}
//output a rectangel to pixbuf
void PutRect(GdkPixbuf*pixbuf, SDL_Rect rect, gint color)
{
gint i;
gint j;
gint x;
gint y;
gint w;
gint h;
if (pixbuf == NULL) return;
w = gdk_pixbuf_get_width (pixbuf);
h = gdk_pixbuf_get_height (pixbuf);
// draw top, buttom line
for(i = 0; i < 2; ++i)
{
if (i == 0) y = rect.y;
else y += rect.h;
x = rect.x;
for(j = 0; j < rect.w; ++j)
{
if ( x+j < w && y < h)
set_pixel_value(pixbuf,x+j, y,color);
}
}
// draw left, right line
for(i = 0; i < 2; ++i)
{
if (i == 0) x = rect.x;
else x += rect.w;
y = rect.y;
for(j = 0; j < rect.h; ++j)
{
if (x < w && y+j < h)
set_pixel_value(pixbuf,x, y+j,color);
}
}
}
int main (int argc, char *argv[])
{
GtkWidget *win = NULL;
GtkWidget *vbox = NULL;
GtkWidget *image;
GdkPixbuf *pixbuf;
SDL_Rect rect;
/* Initialize GTK+ */
gtk_init (&argc, &argv);
/* Create the main window */
win = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_container_set_border_width (GTK_CONTAINER (win), 8);
gtk_widget_set_usize(win, 400, 300);
gtk_window_set_title (GTK_WINDOW (win), "Test draw rectangle to pixbuf");
gtk_window_set_position (GTK_WINDOW (win), GTK_WIN_POS_CENTER);
g_signal_connect (win, "destroy", gtk_main_quit, NULL);
vbox = gtk_vbox_new(FALSE, 50);
gtk_container_add (GTK_CONTAINER (win), vbox);
pixbuf = gdk_pixbuf_new_from_file ("chrismas.jpg", NULL);
rect.x = 20;
rect.y = 20;
rect.w = 150;
rect.h = 150;
//draw a yellow rectangle to pixbuf
PutRect(pixbuf,rect, 0xFFFF0000);
image = gtk_image_new_from_pixbuf (pixbuf);
g_object_unref(pixbuf);
gtk_box_pack_start(GTK_BOX(vbox), image, TRUE, TRUE, 10);
gtk_widget_show_all (win);
gtk_main ();
return 0;
}
用途:有时候传过来一幀图片数据,比如监控软件,并且想让用户在图片上选择区域操作,那就可先通过gdk_pixbuf_new_from_data()将数据导入到GdkPixbuf中,然后在进行以上的画矩形操作后,用gdk_draw_pixbuf画到窗口上,这样就省去上创建透明画布的麻烦,且矩形也不会在视频上不断闪烁。
#include <gtk/gtk.h>
#include <SDL/SDL.h>
void set_pixel_value(GdkPixbuf *pixbuf, int x, int y, int color)
{
guchar *pixel;
guchar *p;
gint channel;
gint rowstride;
if(!pixbuf) return ;
channel = gdk_pixbuf_get_n_channels(pixbuf);
rowstride = gdk_pixbuf_get_rowstride(pixbuf);
pixel = gdk_pixbuf_get_pixels(pixbuf);
p = pixel+y*rowstride+x*channel;
p[0] = (color & 0xFF000000) >>24;
p[1] = (color & 0x00FF0000) >>16;
p[2] = (color & 0x0000FF00) >>8;
}
//output a rectangel to pixbuf
void PutRect(GdkPixbuf*pixbuf, SDL_Rect rect, gint color)
{
gint i;
gint j;
gint x;
gint y;
gint w;
gint h;
if (pixbuf == NULL) return;
w = gdk_pixbuf_get_width (pixbuf);
h = gdk_pixbuf_get_height (pixbuf);
// draw top, buttom line
for(i = 0; i < 2; ++i)
{
if (i == 0) y = rect.y;
else y += rect.h;
x = rect.x;
for(j = 0; j < rect.w; ++j)
{
if ( x+j < w && y < h)
set_pixel_value(pixbuf,x+j, y,color);
}
}
// draw left, right line
for(i = 0; i < 2; ++i)
{
if (i == 0) x = rect.x;
else x += rect.w;
y = rect.y;
for(j = 0; j < rect.h; ++j)
{
if (x < w && y+j < h)
set_pixel_value(pixbuf,x, y+j,color);
}
}
}
int main (int argc, char *argv[])
{
GtkWidget *win = NULL;
GtkWidget *vbox = NULL;
GtkWidget *image;
GdkPixbuf *pixbuf;
SDL_Rect rect;
/* Initialize GTK+ */
gtk_init (&argc, &argv);
/* Create the main window */
win = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_container_set_border_width (GTK_CONTAINER (win), 8);
gtk_widget_set_usize(win, 400, 300);
gtk_window_set_title (GTK_WINDOW (win), "Test draw rectangle to pixbuf");
gtk_window_set_position (GTK_WINDOW (win), GTK_WIN_POS_CENTER);
g_signal_connect (win, "destroy", gtk_main_quit, NULL);
vbox = gtk_vbox_new(FALSE, 50);
gtk_container_add (GTK_CONTAINER (win), vbox);
pixbuf = gdk_pixbuf_new_from_file ("chrismas.jpg", NULL);
rect.x = 20;
rect.y = 20;
rect.w = 150;
rect.h = 150;
//draw a yellow rectangle to pixbuf
PutRect(pixbuf,rect, 0xFFFF0000);
image = gtk_image_new_from_pixbuf (pixbuf);
g_object_unref(pixbuf);
gtk_box_pack_start(GTK_BOX(vbox), image, TRUE, TRUE, 10);
gtk_widget_show_all (win);
gtk_main ();
return 0;
}
- 在GdkPixbuf里画矩形
- 自定义view文字在矩形里居中
- Photoshop里画矩形框
- 用数学方法解决工程问题系列(一) 在Winform里画旋转矩形
- POJ 1410 Intersection(判断线段是否在矩形面里)
- 在地图上画矩形Ajax查询
- 在图像上画矩形 opencv
- GDI+ C# 在图片上画矩形
- Android 在地图上画矩形
- QT在Label上画矩形
- matlab 在照片中画矩形框
- 在windows桌面上画矩形框
- opencv-鼠标在窗口中画矩形
- 在视图画矩形并处理鼠标在矩形上的操作
- GdkPixbuf 的申请与释放
- PyGobject(八十四)GdkPixbuf.Pixbuf
- 画矩形
- 画矩形
- 深入了解字符集和编码
- SQL Server基础概念--视图
- C++ 通过成员函数参数返回成员数组的值
- 亚洲游戏展Freeze化身女神代言《神泣》
- SQL Server基础概念--存储过程
- 在GdkPixbuf里画矩形
- rest自定义action
- SQL Server基础概念--触发器
- Windows XP下也玩Informix
- SQL Server基础概念--事务
- SQL Server基础概念--杂七杂八的一些小地方
- windows下安装perl模块
- text-overflow:ellipsis用法
- Unicode文件操作的一个场景