【发布时间】:2016-02-25 17:37:26
【问题描述】:
目前,我仍在使用带有 COM 类的 C# 库通过 Interop 使用 Nav2009R2 经典版。我的大约 20000 张图片是 Jpeg,没有存储在 DBs blob 中,而是存储在一个简单的网络共享中。 为了转换为 bmp 并缩放这些图片,我在几年前编写了一个小 C# 函数,它仍然可以正常工作。它从文件中读取 jpeg,对其进行转换和缩放,然后将该 bmp 写入 Nav 可以访问它的流。在 Nav 中非常快速、非常稳定且易于使用:
// just bind "TempRec.BlobField" to the picture control, and that´s it within Nav
IF ISCLEAR(LocAutImaging) THEN CREATE(LocAutImaging, FALSE, TRUE);
TempRec.BlobField.CREATEINSTREAM(LocStreamPreviewPic);
LocAutImaging.ConvertFileToBmpStream(LocStreamPreviewPic, '\\..\..\Picture.jpg', 300, 300);
CLEAR(LocAutImaging);
在 Nav 和 C# 中使用流有点棘手,但它确实有效:
public void ConvertFileToBmpStream(object ObjPictureStream, string StrSourceFile, int NewHeigth, int NewWidth)
{
Bitmap MyBitMap = null;
IStream StmPicStream = ObjPictureStream as IStream;
MemoryStream ms = new MemoryStream();
IntPtr rwBytes = Marshal.AllocHGlobal(4);
Image img = Image.FromFile(StrSourceFile);
Size MySize = new Size(NewWidth, NewHeigth);
if (NewHeigth == 0 & NewWidth == 0){ MyBitMap = new Bitmap(img); } else { MyBitMap = new Bitmap(img, MySize); }
MyBitMap.Save(ms, System.Drawing.Imaging.ImageFormat.Bmp);
int StreamLength = Convert.ToInt32(ms.Length);
byte[] buffer = new byte[StreamLength];
buffer = ms.ToArray();
StmPicStream.Write(buffer, StreamLength, rwBytes);
Marshal.FreeHGlobal(rwBytes);
ms.Dispose();
img.Dispose();
MyBitMap.Dispose();
}
虽然一切都很好,但我们现在正在开发 Nav 2016 更新。使用 RTC,COM 控件仍然可以在客户端使用;但是..没有机会,如果您使用的是流!另一方面,您不能不使用 Interop COM 函数在 Nav Server 上运行。
这意味着,我必须将此代码实现为纯 .Net 类中的方法,而不需要 Interop-Interface。 不幸的是,我不知道如何将流从 Nav 传递给 .Net 方法,因此可以像上面的示例一样读取和写入。使用通用“对象”类型并将其转换为 IStream 仍然是最好的方法吗?
提前致谢
皮迪
【问题讨论】:
-
我想将图像转换为位图,因此我将它们存储在一个 blob 文件中。你能否提供更多关于你是如何完成的描述
标签: .net stream nav microsoft-dynamics