C#中的ImageMagick:从转换调用中获取字节数组?

时间:2011-01-13 17:12:15

标签: c# .net com imagemagick

我正在尝试使用随Windows Installer for ImageMagick提供的ImageMagickObject COM组件,将其作为COM引用导入到我的C#项目中。到目前为止,我已经能够使用它将图像从磁盘上的一个文件转换为磁盘上的另一个文件。我试图让它在内存中转换文件并将其返回到字节数组中,如库中包含的ArrayTest.vbs文件所示。有没有人成功地做过这件事?该功能严重缺乏文档...

我的代码:

MagickImageClass _magic = new MagickImageClass();
object[] myarray = new object[1];
myarray[0] = "JPEG:";

object[] args = new object[] { tbFilename.Text, "-colorspace", "cmyk", "-resize", "50%", myarray };
var result = _magic.Convert(ref args);

他们来自ArrayTest.vbs的样本:

Dim img
Dim myarray(1)

Set img = CreateObject("ImageMagickObject.MagickImage.1")
myarray(0)="8BIM:"

msgs = img.Convert("null:","-profile","8BIMTEXT:iptctext.txt",myarray)

如果您不熟悉ImageMagick,“null:”是指定空图像的内置类型。 “-profile”和“8BIM:iptctext.txt”是传递给Convert调用的命令行参数,我的数组本质上是输出。在他们的例子中,myarray最终得到了新转换图像的字节数组。在我的代码中,myarray没有变化。帮助!

2 个答案:

答案 0 :(得分:0)

ImageMagickObject旨在为大多数ImageMagick二进制文件提供等效功能,而无需创建执行二进制文件的过程。在“转换”的情况下,成功案例中没有预期的输出(或ImageMagickObject返回值)。

据我所知,如果您想从C#中获取此选项,可以选择两种方法:

  1. 将图像转换为临时文件,然后使用GDI+ Graphics读取它。
  2. 为ImageMagick的C ++ API创建.NET包装器。您可以通过查看ImageMagickNET来获得良好的开端。

答案 1 :(得分:0)

您从ImageMagickObject源调用的方法的签名是:

[ vararg, id( 6 ) ] HRESULT Convert([ in, out, satype( VARIANT ) ] SAFEARRAY * *pArrayVar, [ out, retval ] VARIANT * pVar );

这似乎意味着它应该接受两个参数,一个将返回一个返回值,但它无法使用除ref object[]个参数之外的任何其他参数进行编译。

我对COM编程不是很熟悉,所以希望有更多的专家来指出这一点,并且可以帮助您找到正确的C#代码。

另外(我确定你注意到了),Visual Studio检测到的方法签名意味着Convertparams object[]的形式接受参数,但它只能用ref object[]编译参数(即使它在编译之前将其标记为错误)。