Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ gtkmm绘制单像素_C++_Drawing_Pixel_Gtkmm - Fatal编程技术网

C++ gtkmm绘制单像素

C++ gtkmm绘制单像素,c++,drawing,pixel,gtkmm,C++,Drawing,Pixel,Gtkmm,请参考上的示例: #包括 #定义图像宽度256 #定义图像高度256 guchar rgbbuf[图像宽度*图像高度*3]; gboolean on_darea_expose(GtkWidget*小部件, GdkEventExpose*事件, gpointer用户(U数据); int main(int argc,char*argv[]) { GtkWidget*窗口,*darea; 金特x,y; 古查尔*pos; gtk_init(&argc,&argv); 窗口=gtk_窗口_新建(gtk_窗

请参考上的示例:

#包括
#定义图像宽度256
#定义图像高度256
guchar rgbbuf[图像宽度*图像高度*3];
gboolean on_darea_expose(GtkWidget*小部件,
GdkEventExpose*事件,
gpointer用户(U数据);
int
main(int argc,char*argv[])
{
GtkWidget*窗口,*darea;
金特x,y;
古查尔*pos;
gtk_init(&argc,&argv);
窗口=gtk_窗口_新建(gtk_窗口_顶层);
darea=gtk_图纸_区域_新();
gtk_widget_set_size_request(数据区域、图像宽度、图像高度);
gtk_容器添加(gtk_容器(窗口),darea);
gtk_信号_连接(gtk_对象(darea),“暴露事件”,
GTK_信号_FUNC(on_darea_expose),空;
gtk_小部件_全部显示(窗口);
/*设置RGB缓冲区*/
pos=rgbbuf;
对于(y=0;y窗口,小部件->样式->fg_gc[GTK_状态_正常],
0,0,图像宽度,图像高度,
GDK_RGB_抖动_最大值、rgbbuf、图像_宽度*3);
返回TRUE;
}
但他们说“
gdk\u draw\u rgb\u image
已被弃用,不应在新编写的代码中使用。”

我希望有一个像素阵列中的图像,我可以直接操纵像素

基本上,我只想“画”一个像素数组,我想修改之前。Cairo是一个很好的工具,但不适合我的目的。因此,
矩形
不是一个选项

这不可能了吗

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

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

非常感谢并致以最诚挚的问候

您必须使用开罗

GDK 3中所有的GDK绘图函数都已弃用并删除

您可以将
GdkPixbuf
与Cairo交互函数
gdk_Cairo_set_source_pixbuf
gdk_Cairo_rectangle
一起使用,您可以像前面描述的那样构建自己的“”函数。 您需要对像素缓冲区进行操作


我也使用了这种方法。

这在gtk中可能很有效,但在cairomm中,
Cairo::Context
中没有名为
set\u source.
的方法,它以Pixbuf作为参数。@Atmocreations,在cairomm中,use可以使用
Cairo::Context::set_source
Cairo::SurfacePattern
环绕
Cairo::ImageSurface
#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;
}