MagickCommandGenesis始终返回MagickFalse

MagickCommandGenesis始终返回MagickFalse,c,imagemagick,magickwand,C,Imagemagick,Magickwand,相关信息真的不多,官方手册让我哭了。我正试图通过MagickCommandGenesis运行自定义脚本,因为我放弃了将一些脚本转换为使用API的干净c代码的尝试。但是,这段代码: //char* cmdargs[] = { "convert", "-rotate", "-90" }; char* cmdargs[] = { "-rotate", "-90" }; int a

相关信息真的不多,官方手册让我哭了。我正试图通过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,但未抛出异常

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

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

Upd: 我发现MagickWand的
image\u info
成员实际上什么都没有(可能它只是用默认值初始化,根本没有被MagickWand使用)。所以现在我正在寻找从内存块实例化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");
    }

不幸的是,我仍然得到“未定义”的错误,所以<代码> MaGeCudidGebug < /C>仍然返回false,但不抛出异常。

< P> >两个要考虑的项目。

第一:
MagickCommandGenesis
需要一个完整而非部分的命令。范例

 convert source.png -rotate -90 out.png
第二:
ImageInfo
指针应该是新分配的内存,以便命令进程对其进行操作。使用
AcquireImageInfo()
,因为给出
wand->image\u info
将导致未定义的行为

理想情况下,您应该只使用C-API方法,但可以利用内存程序寄存器协议
mpr:
将现有的
MagickWand
实例与
MagickCommand
混合使用

MagickWand*wand=NewMagickWand();
MagickReadImage(魔杖,玫瑰:);
MagickNegateImage(魔杖,1);//例如,否定图像
//将图像转移到内存程序寄存器
MagickWriteImage(魔杖,“mpr:my_标签”);
//生成完整命令
char*cmdargs[]={“转换”,
“mpr:my_标签”,
“-轮换”,
"-90",
“output.png”、//或其他mpr:
空};
int argcount=5;
//为MagickCommand分配内存
ImageInfo*info=AcquireImageInfo();
ExceptionInfo*e=AcquireExceptionInfo();
//执行命令
MagickCommandGenesis(info、ConvertImageCommand、argcount、cmdargs、NULL、e);
魔杖=魔杖(魔杖);
/*省略错误处理*/

魔杖->图像信息是如何定义的?它是ImageMagick核心的内部结构。我不熟悉它的代码,但struct看起来像。如果你问我是怎么定义的,我不知道。我以为它是在我把图像读给MagickWand时定义的。@emcconville好的,我意识到wand->image\u info->length是0,blob是空的,所以MagickWand看起来根本没有填充这个结构。因此,问题变为“是否可以从MagickWand实例化适当的ImageInfo并将其传递给MagickCommandGenesis”?抱歉,我想我早在八月份就回答了这个问题。我已经尝试重新发布我的原始答案。@emcconville事实上,我用openCV重写了整个项目以获得更高的速度,但我会尝试你的答案,因为我仍然对如何解决这个原始问题感兴趣。