繁体   English   中英

MagickCommandGenesis始终返回MagickFalse

[英]MagickCommandGenesis always returns MagickFalse

确实没有太多相关信息,而且官方手册让我哭了。 我试图通过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");
    }

总是写“未定义”,即MagickCommandGenesis返回false,但未引发异常。

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

我发现的唯一一个相关问题在这里,但没有那么有用。 更何况,OP使用读取和写入文件的方式仍然出现错误。 有标记为已接受的答案,但建议使用MagickCommandGenesis ,我已经做了。

UPD:

我发现image_info成员实际上没有任何内容(可能只是使用默认值初始化,而image_info根本没有使用过)。 所以现在我在寻找从内存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方法完全,但你可以混合现有MagickWand与实例MagickCommand通过利用存储程序寄存器协议mpr:

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 */

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM