gtkmm 绘制单个像素

Posted

技术标签:

【中文标题】gtkmm 绘制单个像素【英文标题】:gtkmm drawing single pixels 【发布时间】:2011-10-29 19:37:42 【问题描述】:

参考Documentation for Gtkmms GdkRGB上的例子:

#include <gtk/gtk.h>
#define IMAGE_WIDTH 256
#define IMAGE_HEIGHT    256
guchar rgbbuf[IMAGE_WIDTH * IMAGE_HEIGHT * 3];
gboolean on_darea_expose (GtkWidget *widget,
          GdkEventExpose *event,
          gpointer user_data);
int
main (int argc, char *argv[])

  GtkWidget *window, *darea;
  gint x, y;
  guchar *pos;
  gtk_init (&argc, &argv);
  window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
  darea = gtk_drawing_area_new ();
  gtk_widget_set_size_request (darea, IMAGE_WIDTH, IMAGE_HEIGHT);
  gtk_container_add (GTK_CONTAINER (window), darea);
  gtk_signal_connect (GTK_OBJECT (darea), "expose-event",
                  GTK_SIGNAL_FUNC (on_darea_expose), NULL);
  gtk_widget_show_all (window);
  /* Set up the RGB buffer. */
  pos = rgbbuf;
  for (y = 0; y < IMAGE_HEIGHT; y++)
    
      for (x = 0; x < IMAGE_WIDTH; x++)
    
      *pos++ = x - x % 32;          /* Red. */
      *pos++ = (x / 32) * 4 + y - y % 32;   /* Green. */
      *pos++ = y - y % 32;          /* Blue. */
    
    
  gtk_main ();
  return 0;

gboolean
on_darea_expose (GtkWidget *widget,
     GdkEventExpose *event,
     gpointer user_data)

  gdk_draw_rgb_image (widget->window, widget->style->fg_gc[GTK_STATE_NORMAL],
          0, 0, IMAGE_WIDTH, IMAGE_HEIGHT,
          GDK_RGB_DITHER_MAX, rgbbuf, IMAGE_WIDTH * 3);
  return TRUE;

但他们说“gdk_draw_rgb_image 已弃用,不应在新编写的代码中使用。”

我想要一个像素数组中的图像,我可以在其中直接操作像素。

基本上,我只是想“绘制”一个我想修改的像素数组。 Cairo 是一个不错的工具,但不适合我的目的。因此,rectangle 不是一个选项。

这不可能了吗?

嗯,我之前提到的例子是可行的,但我不喜欢在新代码中使用不推荐使用的库。

那我还能怎么画我的像素呢? 这是一个 gtk 示例。我们正在使用 GtkMM,我想知道是否有与此等价的工具。

非常感谢和最好的问候

【问题讨论】:

【参考方案1】:

使用 cairo。

所有 GDK 绘图功能在 GDK 3 中已弃用和删除。

您可以使用 GdkPixbuf http://developer.gnome.org/gdk-pixbuf/unstable//gdk-pixbuf-The-GdkPixbuf-Structure.html#GdkPixbuf 与 Cairo 交互函数 gdk_cairo_set_source_pixbufgdk_cairo_rectangle http://developer.gnome.org/gdk3/stable/gdk3-Cairo-Interaction.html。

【讨论】:

这可能在 gtk 中运行良好,但在 cairomm 中,Cairo::Context 中没有名为 set_source_* 的方法以 Pixbuf 作为参数。 @Atmocreations,在 cairomm 中,可以使用 Cairo::Context::set_sourceCairo::SurfacePattern 包裹 Cairo::ImageSurface【参考方案2】:

您可以构建自己的“put_pixels(...)”函数,如所述here。 您需要对像素缓冲区进行操作。

我也用过这种方法。

【讨论】:

以上是关于gtkmm 绘制单个像素的主要内容,如果未能解决你的问题,请参考以下文章

如何在OpenGL中绘制单个像素?

使用画布绘制单个像素

在 HTML5 画布上绘制一个点 [重复]

移动端

2.绘制简单的几何图形

如何编辑 BufferedImage 中的像素?