2016-09-23 54 views
1

毫无疑问,这是不可能的,但我想看看是否有人有一个巧妙的建议。我们可以输出的图像内部存储定制的数据库内的第三方组件文件中使用的内部方法“的SaveToFile”,一个例子:截取文件流...不可能吗?

3rdParty.Scripting.ImageManager man = new 3rdParty.Scripting.ImageManager("ref"); 

3rdParty.Scripting.Image itemImg = man.GetImage(orderNumber); 

itemImg.SaveToFile("c:\file.jpg") 

ItemImg.SaveToFile没有返回类型,只是在内部创建一个位图并将其写入文件流。我们完全不能访问编译的方法。

我需要做的是以某种方式拦截文件流并阅读位图,我知道这可能是不可能的,但我不是绝对的专家,所以想看看是否有一种神奇的方式来做到这一点。

如果一切都失败了,我会保存文件,然后读回来,我只是想避免保存到磁盘,我可能直接获取数据,并最终将其转换为base64字符串值。

+0

使用MemoryStream。 – jdweng

+1

'3rdParty.Scripting.Image itemImg = man.GetImage(orderNumber);' - 这是在内存中的图像,不是吗?当然,如果你有权访问所有的像素数据,那么你不能只从'itemImg'构造“base64字符串值”吗? – Quantic

+0

林与@Quantic对此。做一些调试,看看这个'Image'类型的私有成员是什么。如果在托管内存中加载了某些内容,则可以使用反射从该类型的私有成员获取该流。代码虽然会非常脆弱,应该重新测试该库所做的任何版本更改。 – Igor

回答

8

不幸的是,除非第三方库提供了一个SaveToStream方法,您可以从外部提供流,否则无法实现您的目标。您将不得不将内容保存到临时文件,然后再读取内容。

这就是为什么当设计一个库来提供Streams作为I/O参数的方法时,这通常是最好的实践,因为这会让消费者控制是否要将它保存到文件,内存或网络流。

+0

感谢Darin,我的想法正是......这是一个可怕的图书馆,但我们别无选择,只能使用它。 –