C 如何使用gimp_drawable_set_pixel()?

C 如何使用gimp_drawable_set_pixel()?,c,gimp,C,Gimp,我想在GIMP中设置一个像素,但我不知道如何指定像素值 根据报告,它说: 如果,例如,执行以下操作: 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); 未设置像素,且s为零 有人能想出这个吗 很多爱, 路易丝 这是我在Makefile中

我想在GIMP中设置一个像素,但我不知道如何指定像素值

根据报告,它说:

如果,例如,执行以下操作:

  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);
未设置像素,且s为零

有人能想出这个吗

很多爱, 路易丝

这是我在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()
#包括
#包括
#包括
#包括
静态空隙
查询(作废)
{
静态GimpParamDef参数[]=
{
{
GIMP_PDB_INT32,
“运行模式”,
“运行模式”
},
};
gimp_安装程序(
“插入hello”,
“你好,世界!”,
“在对话框中显示\“你好,世界!\”,
“大卫·尼里”,
“David Neary版权所有”,
"2004",
“你好,世界……”,
无效的
GIMP_插件,
G_N_元素(args),0,
args,NULL);
gimp插件菜单寄存器(“插件你好”,
“/Filters/Misc”);
}
静态空隙
运行(const gchar*名称,
金特·帕拉姆斯,
常数GimpParam*param,
gint*n返回值,
框架图**返回值
{
静态GimpParam值[1];
GIMPPDSTATUSTYPE状态=GIMP_PDB_成功;
GIMPRUN模式运行模式;
gint32图像;
银杏32层;
gint32显示器;
/*设置强制输出值*/
*nreturn_vals=1;
*返回值=值;
值[0]。类型=GIMP_PDB_状态;
值[0]。data.d_status=status;
/*正在运行\u模式-如果
*我们处于非交互模式*/
运行模式=参数[0]。data.d_int32;
image=gimp_image_new(800600,gimp_RGB);
图层=gimp\u图层\u新建(图像,
“福”,
800, 600,
GIMP_RGBA_图像,
100.0,
GIMP_正常模式);
gimp_图像_添加_层(图像,层,0);
gboolean s;
guint8像素[]={0xff,0,0,0xff};
s=gimp_可绘制_集_像素(层,5,5,4,(guint8*)像素);
printf(“是否设置了像素?:%i”,s);
显示=gimp\u显示\u新建(图像);
if(运行模式!=GIMP\U运行模式非交互式)
g_信息(“你好,世界!\n”);
}
GimpPlugInInfo插件信息=
{
无效的
无效的
查询
跑
};
MAIN()
生成文件

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
CC=gcc
CFLAGS=-std=c99-O2-壁\
-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/开罗\
-I/usr/include/pango-1.0\
-I/usr/include/pixman-1\
-I/usr/include/FREETYPE 2\
-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-LPANGOCARO-1.0\
-lcairo-lpango-1.0-lfreetype-lfontconfig-lgobject-2.0\
-lgmodule-2.0-lglib-2.0
files=main.o
全部:主要
main:$(文件)
$(CC)$(CFLAGS)$(文件)$(LDFLAGS)-o主
安装:
gimptool-2.0--安装main.c
%.o:%.c生成文件
$(CC)-c$(CFLAGS)$<
清洁:
rm-f*.o
rm-f*~
rm-f干管
.骗子:都是干净的

更新:代码现在根据注释进行了更正,因此现在可以正常工作了。它会绘制一个红色像素。

像素值取决于要绘制到的可绘制对象的像素格式。在本例中,您已将层创建为RGBA,因此像素参数应该是包含四个值的数组的地址。例如,该值将为您提供一个不透明的红色像素:

guint8 pixel[] = { 0xff, 0, 0, 0xff };
在第一行,您声明了一个指向
guint8
的指针,它不分配任何内存,指针指向一些垃圾。在第二行,将指针指向
NULL
。您需要
malloc/free
像素缓冲区,或者更好地使用堆栈

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);
堆栈:

guint8 pixels[] = {0, 0, 0, 0};
s = gimp_drawable_set_pixel (layer, 5, 5, 3, pixel);

如果您初始化malloc-ed内存并删除强制转换,这看起来会更好。太棒了!gimp_drawable_set_pixel()的API说我必须以bbp(每像素字节数)表示像素颜色。我想绘制的像素是16位灰度。如何将其转换为这种格式?使用红色=)将alpha设置为0xff也是个好主意。谢谢。我的目标是“GIMP_GRAY_图像”,并且能够直接绘制双倍图像。你知道这个的像素格式吗?
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);
guint8 pixels[] = {0, 0, 0, 0};
s = gimp_drawable_set_pixel (layer, 5, 5, 3, pixel);