Comment utiliser gimp_drawable_set_pixel ()?
Question
Je pourrais vous définir un pixel dans GIMP, mais je ne peux pas comprendre comment spécifier la valeur de pixel.
Selon le plug-in GIMP API il est dit:
gboolean gimp_drawable_set_pixel (gint32 drawable_ID,
gint x_coord,
gint y_coord,
gint num_channels,
const guint8 *pixel);
Si je par exemple faire:
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 est pas définie, et s est égal à zéro.
Quelqu'un peut-il comprendre cela?
Beaucoup d'amour, Louise
est le code que je utilise avec Makefile:
#include <libgimp/gimp.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
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",
"<Image>/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, alors maintenant il fonctionne. Il dessine un pixel rouge.
La solution
const guint8 *pixel;
pixel = (guint8 *) 0;
Sur la première ligne vous déclarez un pointeur vers guint8
, qui n'alloue pas de mémoire et les points de pointeur des ordures. Sur la deuxième ligne que vous faites le point de pointeur vers NULL
. Vous devez soit malloc/free
le tampon de pixels, ou mieux encore, utilisez la pile.
Malloc / Free
guint8 *pixel = malloc(sizeof(guint8) * num_channels);
/* R G B A */
pixel[0] = 0; pixel[1] = 0; pixel[2] = 0; pixel[3] = 0;
s = gimp_drawable_set_pixel (layer, 5, 5, 3, pixel);
free(pixel);
Stack:
guint8 pixels[] = {0, 0, 0, 0};
s = gimp_drawable_set_pixel (layer, 5, 5, 3, pixel);
Autres conseils
La valeur de pixel dépend du format de pixel de l'drawable vous dessinez à. Dans ce cas, vous avez créé la couche comme RGBA, de sorte que le paramètre de pixel doit être l'adresse d'un tableau contenant quatre valeurs. Par exemple. cette valeur vous donnera un pixel rouge opaque:
guint8 pixel[] = { 0xff, 0, 0, 0xff };