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.

Était-ce utile?

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 };
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top