Cómo utilizar gimp_drawable_set_pixel ()?
Pregunta
Podría gustaría establecer un píxel en GIMP, pero no puedo encontrar la manera de especificar el valor del píxel.
De acuerdo con el plugin GIMP API que dice:
gboolean gimp_drawable_set_pixel (gint32 drawable_ID,
gint x_coord,
gint y_coord,
gint num_channels,
const guint8 *pixel);
Si, por ejemplo, hacer:
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);
El píxel no está establecido, y s es cero.
¿Alguien puede imaginar éste?
Con mucho amor, Louise
Este es el código que estoy utilizando con 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
Actualización: El código es ahora corrige de acuerdo con los comentarios, por lo que ahora funciona. Se dibuja un píxel rojo.
Solución
const guint8 *pixel;
pixel = (guint8 *) 0;
En la primera línea se declara un puntero a guint8
, que no asigna ninguna memoria y el puntero apunta a un poco de basura. En la segunda línea a tomar la punta puntero a NULL
. O hay que hacer malloc/free
la memoria intermedia de píxeles, o mejor aún, el uso de pila.
Malloc / Libre
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);
Pila:
guint8 pixels[] = {0, 0, 0, 0};
s = gimp_drawable_set_pixel (layer, 5, 5, 3, pixel);
Otros consejos
El valor de píxel depende del formato de píxel de la estirable que está dibujando a. En este caso, que ha creado la capa como RGBA, por lo que el parámetro de píxeles debe ser la dirección de una matriz que contiene cuatro valores. P.ej. este valor le daría un píxel de color rojo opaco:
guint8 pixel[] = { 0xff, 0, 0, 0xff };