[英]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
,我已经做了。
我发现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.