在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;
}
原创粉丝点击