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.

War es hilfreich?

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 };
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top