Wie verwenden gimp_drawable_set_pixel ()?
Frage
Ich könnte wie ein Pixel in GIMP setzen, aber ich kann nicht herausfinden, wie der Pixelwert angeben.
Nach der GIMP-Plugin API heißt es:
gboolean gimp_drawable_set_pixel (gint32 drawable_ID,
gint x_coord,
gint y_coord,
gint num_channels,
const guint8 *pixel);
Wenn ich z tun:
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);
Das Pixel nicht gesetzt ist, und s gleich Null ist.
Kann jemand Figur dieses aus?
Alles Liebe, Louise
Dies ist der Code, den ich mit Makefile bin mit:
#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
Update: Der Code nun nach den Kommentaren korrigiert wird, so jetzt funktioniert es. Es zieht ein rotes Pixel.
Lösung
const guint8 *pixel;
pixel = (guint8 *) 0;
In der ersten Zeile deklarieren Sie einen Zeiger auf guint8
, die keinen Speicher und die Zeiger auf einen leichten Müll zuzuordnet. In der zweiten Zeile machen Sie den Zeiger Punkt NULL
. Sie müssen entweder die Pixelpuffer malloc/free
, oder besser noch, verwenden Stack.
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);
Andere Tipps
Der Pixelwert ist abhängig von dem Pixelformat des ziehbar Sie sind zu ziehen. In diesem Fall haben Sie die Schicht als RGBA erstellt, so dass die Pixel Parameter die Adresse eines Array mit vier Werten sein sollten. Z.B. dieser Wert würde Ihnen eine undurchsichtige rote Pixel geben:
guint8 pixel[] = { 0xff, 0, 0, 0xff };