繁体   English   中英

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

[英]ImageMagick in C#: Get byte array from Convert call?

我正在尝试使用随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没有变化。 救命!!

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

据我所知,如果你想从C#中得到这个,我有两个选择:

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

您从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[]参数进行编译(即使它将其标记为编译前的错误)。

暂无
暂无

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

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