c - MagickCommandGenesis 总是返回 MagickFalse

标签 c imagemagick magickwand

相关资料真的不多,官方手册看哭了。我正在尝试通过 MagickCommandGenesis 运行自定义脚本,因为我放弃了尝试使用 API 将一些脚本转换为干净的 c 代码。然而,这段代码:

    //char* cmdargs[] = { "convert", "-rotate", "-90" };
    char* cmdargs[] = { "-rotate", "-90" };
    int argcount = 2;

    ExceptionInfo* e = AcquireExceptionInfo();
    GetExceptionInfo(e);
    MagickBooleanType cmdres = MagickCommandGenesis(wand->image_info, ConvertImageCommand, argcount, cmdargs, NULL, e);

    if (e->severity != UndefinedException || cmdres == MagickFalse) {
        syslog(LOG_NOTICE, "mwb::error:%s", e->severity != UndefinedException ? "derp" : "undefined");
    }

总是写“undefined”,即 MagickCommandGenesis 返回 false,但没有抛出异常。

我不能使用临时文件来读取或写入,我想在内存中进行所有操作,因此 wand 是通过 MagickReadImageBlob 读取的。 Blob 是绝对有效的,我可以进行任何 API 操作并最终在屏幕上绘制图像,唯一不起作用的是命令运行。

我发现的唯一一个相关问题是 here但它不是那么有用。更重要的是,OP 在文件中使用了读取和写入,但仍然出现错误。有标记为已接受的答案,但它建议使用 MagickCommandGenesis,我已经这样做了。

更新:

我发现 MagickWand 的 image_info 成员实际上什么都没有(可能它只是用默认值初始化并且根本没有被 MagickWand 使用)。所以现在我正在寻找从内存 blob 实例化 ImageInfo 结构的正确方法。这就是我的尝试:

    char* cmdargs[] = { "-rotate", "-90" };
    int argcount = 2;

    ExceptionInfo* e = AcquireExceptionInfo();
    GetExceptionInfo(e);

    size_t len;
    u_char* blob = MagickGetImageBlob(wand, &len);
    ImageInfo* info = CloneImageInfo(NULL);
    SetImageInfoBlob(info, blob, len);

    MagickBooleanType cmdres = MagickCommandGenesis(info, ConvertImageCommand, argcount, cmdargs, NULL, e);
    
    MagickWand* target = NewMagickWand();
    MagickReadImageBlob(target, info->blob, info->length);
    // DestroyMagickWand(wand);
    wand = target;

    syslog(LOG_NOTICE, "mwb::blob is %zu", MagickGetImageWidth(target));

    if (e->severity != UndefinedException || cmdres == MagickFalse) {
        syslog(LOG_NOTICE, "mwb::error:%s", e->severity != UndefinedException ? "derp" : "undefined");
    }

不幸的是,我仍然遇到“未定义”错误,所以 MagickCommandGenesis 仍然返回 false,但不会抛出异常。

最佳答案

需要考虑的两个项目。

首先:MagickCommandGenesis 期待一个完整的,而不是部分的命令。示例

 convert source.png -rotate -90 out.png

其次:ImageInfo 指针应该是新分配的内存,供命令进程进行操作。使用 AcquireImageInfo(),因为提供wand->image_info 将导致未定义的行为。

理想情况下,您应该仅使用 C-API 方法,但您可以通过利用内存程序寄存器协议(protocol) mpr:<将现有的 MagickWand 实例与 MagickCommand/.

MagickWand *wand = NewMagickWand();
MagickReadImage(wand, "rose:");
MagickNegateImage(wand, 1); // For example, negate image
// Hand-off image to memory program register
MagickWriteImage(wand, "mpr:my_label");
// Build full command
char* cmdargs[] = {"convert",
                   "mpr:my_label",
                   "-rotate",
                   "-90",
                   "output.png", // Or to another mpr:
                   NULL};
 int argcount = 5;
 // Allocate memory for MagickCommand
 ImageInfo * info = AcquireImageInfo();
 ExceptionInfo* e = AcquireExceptionInfo();
 // Execute command
 MagickCommandGenesis(info, ConvertImageCommand, argcount, cmdargs, NULL, e);
 wand = DestroyMagickWand(wand);
 /* Error handling omitted */

关于c - MagickCommandGenesis 总是返回 MagickFalse,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25431770/

相关文章:

c - 如果禁用 ASLR,mmap 是否具有确定性?

java - 在java中执行外部命令

c - 将 ImageMagick lib 的 ImageWand 组件与 CMake 结合使用

imagemagick - Python Magickwand pdf 到图像转换并调整图像大小

python - wand - 文本换行 - 基于图像文件大小

c - 如何用 C 表示货币或金钱

c++ - 是否有一个标准函数可以打印/监视标准输入文件的内容,同时将数据留在标准输入中?

imagemagick - 使用 ImageMagick 在一个正方形中组合多个图像并调整其大小

c - GtkEntry 和 "editing_done"信号

java - org.im4java.core.CommandException : magick: no images found for operation 错误