相关资料真的不多,官方手册看哭了。我正在尝试通过 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/