【问题标题】:ImageMagick in C#: Get byte array from Convert call?C# 中的 ImageMagick:从 Convert 调用中获取字节数组?
【发布时间】:2011-06-08 15:39:00
【问题描述】:

我正在尝试使用随 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”是传递给转换调用的命令行参数,我的数组本质上是输出。在他们的示例中, myarray 以新转换图像的字节数组结束。在我的代码中, myarray 没有改变。救命!!

【问题讨论】:

  • 输出似乎是结果变量,而不是 myarray。结果的内容是什么?

标签: c# .net com imagemagick


【解决方案1】:

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

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

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

【讨论】:

  • 很遗憾,我不能使用选项 1——我们正在处理 GDI+ 不支持的 CMYK JPEG。我不想为 ImageMagick 做一个包装——我们尝试使用 ImageMagickNET 但没有成功。尽管在开发过程中没有出现此类问题,但进程会尝试读取或写入 Web 服务器上受保护的内存时遇到内存错误。 Convert should 有某种返回类型 - 否则转换后的文件会在哪里结束?他们包含在 ImageMagickObject 中的示例代码显示它将结果“返回”到 myarray 对象中。在 C# 中它没有这样的事情。
  • 我看到 #2 有类似的内存问题,所以我不怪你放弃了这种方法。
【解决方案2】:

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

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

这似乎暗示它应该接受两个参数,一个将输出一个返回值,但它无法使用除单个 ref object[] 参数之外的任何参数进行编译。

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

另外(我相信你已经注意到了),Visual Studio 检测到的方法签名暗示Convert 采用params object[] 形式的参数,但它只会使用一个ref object[] 参数进行编译(即使它编译前将其标记为错误)。

【讨论】:

  • 是的 - 这正是我遇到的。在这一点上,我们已经放弃了 ImageMagick 并且我相信正在使用 JpegLib。感谢您的跟进……干杯!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-20
  • 1970-01-01
  • 1970-01-01
  • 2021-09-03
  • 1970-01-01
相关资源
最近更新 更多