2011-10-29 5 views
3

:gtkmm 그리기 하나의 픽셀

#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는 사용되지 않으며 새로 작성된 코드에서 사용할 수 없습니다."라고

나는 픽셀을 직접 조작 할 수있는 픽셀 배열로 이미지를 갖고 싶습니다.

기본적으로 필자는 이전에 수정하고 싶었던 픽셀 배열을 "그리기"를 원합니다. 카이로는 좋은 도구이지만 내 목적에는 적합하지 않습니다. 따라서 rectangle은 선택할 수 없습니다.

더 이상 가능하지 않습니까?

글쎄, 내가 앞에서 언급 한 예는 작품이지만, 나는 더 이상 사용하지 않는 라이브러리를 새로운 코드에 사용하지 않기를 바란다.

그렇다면 어떻게 픽셀을 그릴 수 있습니까? 그리고 이것은 gtk 예제입니다. 우리는 GtkMM을 사용하고 있으며 이에 상응하는 것이 있는지 알고 싶습니다.

많은 감사와 안부

답변

2

당신은 카이로를 사용하는이 .

모든 GDK 그리기 기능 당신은 카이로의 상호 작용 기능 gdk_cairo_set_source_pixbufgdk_cairo_rectanglehttp://developer.gnome.org/gdk3/stable/gdk3-Cairo-Interaction.htmlGdkPixbufhttp://developer.gnome.org/gdk-pixbuf/unstable//gdk-pixbuf-The-GdkPixbuf-Structure.html#GdkPixbuf을 사용할 수 있습니다 GDK 3.

에서 사용되지 않으며 제거됩니다.

+0

이것은 gtk에서는 잘 작동하지만 cairomm에서는 Pixbuf를 인수로 사용하여'Cairo :: Context'에'set_source_ *'라는 메서드가 없습니다. – Atmocreations

+1

@Atmocreations, cairomm에서 use는'Cairo :: Context :: set_source'와'Cairo :: SurfacePattern'을'Cairo :: ImageSurface'로 싸서 사용할 수 있습니다. – chill

+0

감사합니다! 약간의 헛소리 였지만 효과가있었습니다. – Atmocreations

0

here과 같은 고유 한 "put_pixels(...)"기능을 만들 수 있습니다. 픽셀 버퍼에서 작업해야합니다.

나는 또한이 접근법을 사용했다.