如何传递参数?

时间:2017-04-14 07:16:56

标签: c imagemagick magickwand

我一直在将convert rose.png -sparse-color barycentric '0,0 black 69,0 white roseModified.png转换为MagickWand C API。

double arguments[6];
arguments[0] = 0.0;
arguments[1] = 0.0;
// arguments[2] = "black";
arguments[2] = 69.0;
arguments[3] = 0.0;
// arguments[5] = "white";

MagickSparseColorImage(wand0, BarycentricColorInterpolate, 4,arguments);
MagickWriteImage(wand0,"rose_cylinder_22.png");

我不知道如何通过double argumentclick here 方法的捍卫。

更新 源图片

enter image description here

执行convert rose.png -sparse-color barycentric '0,0 black 69,0 white' roseModified.png后,我得到了图像

enter image description here

我的C程序没有得到这样的输出。可能有白色和黑色的东西。

1 个答案:

答案 0 :(得分:1)

对于稀疏颜色,您需要将颜色转换为每个通道的双精度数。根据生成备用色点所需的动态,您可能需要开始构建基本的堆栈管理方法。

这是一个例子。 (请注意,这是一个快速示例,可以大大改进)

#include <stdlib.h>
#include <MagickWand/MagickWand.h>

// Let's create a structure to keep track of arguments.
struct arguments {
    size_t count;
    double * values;
};

// Set-up structure, and allocate enough memory for all colors.
void allocate_arguments(struct arguments * stack, size_t size)
{
    stack->count = 0;
    // (2 coords + 3 color channel) * number of colors
    stack->values = malloc(sizeof(double) * (size * 5));
}

// Append a double value to structure.
void push_double(struct arguments * stack, double value)
{
    stack->values[stack->count++] = value;
}

// Append all parts of a color to structure.
void push_color(struct arguments * stack, PixelWand * color)
{
    push_double(stack, PixelGetRed(color));
    push_double(stack, PixelGetGreen(color));
    push_double(stack, PixelGetBlue(color));
}

#define NUMBER_OF_COLORS 2

int main(int argc, const char * argv[]) {

    MagickWandGenesis();

    MagickWand * wand;
    PixelWand ** colors;

    struct arguments A;
    allocate_arguments(&A, NUMBER_OF_COLORS);

    colors = NewPixelWands(NUMBER_OF_COLORS);
    PixelSetColor(colors[0], "black");
    PixelSetColor(colors[1], "white");
    // 0,0 black
    push_double(&A, 0);
    push_double(&A, 0);
    push_color(&A, colors[0]);
    // 69,0 white
    push_double(&A, 69);
    push_double(&A, 0);
    push_color(&A, colors[1]);

    // convert rose:
    wand = NewMagickWand();
    MagickReadImage(wand, "rose:");
    // -sparse-color barycentric '0,0 black 69,0 white'
    MagickSparseColorImage(wand, BarycentricColorInterpolate, A.count, A.values);
    MagickWriteImage(wand, "/tmp/output.png");

    MagickWandTerminus();
    return 0;
}