Comment utiliser gimp_drawable_set_pixel ()?

J’aimerais pouvoir définir un pixel dans GIMP, mais je ne vois pas comment spécifier la valeur du pixel.

Selon l’ API du plugin GIMP, il est écrit:

gboolean gimp_drawable_set_pixel (gint32 drawable_ID, gint x_coord, gint y_coord, gint num_channels, const guint8 *pixel); 

Si je fais par exemple:

  const guint8 *pixel; pixel = (guint8 *) 0; gboolean s; s = gimp_drawable_set_pixel (layer, 5, 5, 3, pixel); printf ("Was the pixel set?: %i", s); 

Le pixel n’est pas défini et s vaut zéro.

Quelqu’un peut-il comprendre celui-ci?

Beaucoup d’amour, Louise

C’est le code que j’utilise avec Makefile:

 #include  #include  #include  #include  static void query (void) { static GimpParamDef args[] = { { GIMP_PDB_INT32, "run-mode", "Run mode" }, }; gimp_install_procedure ( "plug-in-hello", "Hello, world!", "Displays \"Hello, world!\" in a dialog", "David Neary", "Copyright David Neary", "2004", "_Hello world...", NULL, GIMP_PLUGIN, G_N_ELEMENTS (args), 0, args, NULL); gimp_plugin_menu_register ("plug-in-hello", "/Filters/Misc"); } static void run (const gchar *name, gint nparams, const GimpParam *param, gint *nreturn_vals, GimpParam **return_vals) { static GimpParam values[1]; GimpPDBStatusType status = GIMP_PDB_SUCCESS; GimpRunMode run_mode; gint32 image; gint32 layer; gint32 display; /* Setting mandatory output values */ *nreturn_vals = 1; *return_vals = values; values[0].type = GIMP_PDB_STATUS; values[0].data.d_status = status; /* Getting run_mode - we won't display a dialog if * we are in NONINTERACTIVE mode */ run_mode = param[0].data.d_int32; image = gimp_image_new (800, 600, GIMP_RGB); layer = gimp_layer_new (image, "foo", 800, 600, GIMP_RGBA_IMAGE, 100.0, GIMP_NORMAL_MODE); gimp_image_add_layer (image, layer, 0); gboolean s; guint8 pixel[] = { 0xff, 0, 0, 0xff }; s = gimp_drawable_set_pixel (layer, 5, 5, 4, (guint8 *)pixel ); printf ("Was the pixel set?: %i", s); display = gimp_display_new (image); if (run_mode != GIMP_RUN_NONINTERACTIVE) g_message("Hello, world!\n"); } GimpPlugInInfo PLUG_IN_INFO = { NULL, NULL, query, run }; MAIN() 

Makefile

 CC = gcc CFLAGS = -std=c99 -O2 -Wall \ -I/usr/include/gimp-2.0 \ -I/usr/include/glib-2.0 \ -I/usr/lib64/glib-2.0/include \ -I/usr/include/gtk-2.0 \ -I/usr/lib64/gtk-2.0/include \ -I/usr/include/atk-1.0 \ -I/usr/include/cairo \ -I/usr/include/pango-1.0 \ -I/usr/include/pixman-1 \ -I/usr/include/freetype2 \ -I/usr/include/libpng12 LDFLAGS = -lgimpui-2.0 -lgimpwidgets-2.0 -lgimpmodule-2.0 -lgimp-2.0 \ -lgimpmath-2.0 -lgimpconfig-2.0 -lgimpcolor-2.0 \ -lgimpbase-2.0 -lgtk-x11-2.0 -lgdk-x11-2.0 -latk-1.0 \ -lgio-2.0 -lpangoft2-1.0 -lgdk_pixbuf-2.0 -lpangocairo-1.0 \ -lcairo -lpango-1.0 -lfreetype -lfontconfig -lgobject-2.0 \ -lgmodule-2.0 -lglib-2.0 files = main.o all: main main: $(files) $(CC) $(CFLAGS) $(files) $(LDFLAGS) -o main install: gimptool-2.0 --install main.c %.o: %.c Makefile $(CC) -c $(CFLAGS) $< clean: rm -f *.o rm -f *~ rm -f main .PHONY: all clean 

Mise à jour: Le code est maintenant corrigé en fonction des commentaires, donc ça fonctionne maintenant. Il dessine un pixel rouge.

     const guint8 *pixel; pixel = (guint8 *) 0; 

    Sur la première ligne, vous déclarez un pointeur sur guint8 , qui n’alloue aucune mémoire et le pointeur pointe sur un bourrage. Sur la deuxième ligne, vous faites pointer le pointeur sur NULL . Vous devez soit malloc/free le tampon de pixels, ou mieux encore, utiliser stack.

    Malloc / Gratuit

     guint8 *pixel = malloc(sizeof(guint8) * num_channels); /* RGBA */ pixel[0] = 0; pixel[1] = 0; pixel[2] = 0; pixel[3] = 0; s = gimp_drawable_set_pixel (layer, 5, 5, 3, pixel); free(pixel); 

    Emstackr:

     guint8 pixels[] = {0, 0, 0, 0}; s = gimp_drawable_set_pixel (layer, 5, 5, 3, pixel); 

    La valeur en pixels dépend du format en pixels du dessin que vous dessinez. Dans ce cas, vous avez créé le calque en tant que RGBA. Le paramètre pixel doit donc être l’adresse d’un tableau contenant quatre valeurs. Par exemple, cette valeur vous donnerait un pixel rouge opaque:

     guint8 pixel[] = { 0xff, 0, 0, 0xff };