我正在尝试加载高分辨率图像(如3264x2448)。为此,我在C#中使用IImageFactory类。 IImageFactory是从Microsoft站点下载的。如果我尝试加载高分辨率图像,我会遇到“内存不足”异常。看看下面的示例:
IImage GetIImage(string fileName)
{
Bitmap bitmap = null;
Graphics graphics = null;
IntPtr hdcDestination = IntPtr.Zero;
try {
IImage image = null;
IImagingFactory imagingFactory = ImagingFactory.GetImaging();
imagingFactory.CreateImageFromFile(fileName, out image);
bitmap = new Bitmap(width, height);
graphics = Graphics.FromImage(bitmap);
hdcDestination = graphics.GetHdc();
Rectangle dstRect = new Rectangle(0, 0, width, height);
image.Draw(_graphicsHDC, ref dstRect, IntPtr.Zero);
}
catch{}
}
使用上面的源代码行,我能够加载图像,但我绘制图像的努力失败,抛出OutOfMemory Excep :( 此外,我通过创建一个Win32移动应用程序尝试了相同的操作,我可以在其中使用以下行加载和绘制所需的图像。
void DrawImage(HDC *hdc, char *FileName, int width, int height)
{
IImagingFactory *pImgFactory = NULL;
IImage *pImage = NULL;
RECT rc = { 0, 0, width, height};
WCHAR Name[MAX_PATH] ={0};
mbstowcs (Name, FileName, strlen (FileName));
CoInitializeEx(NULL, COINIT_MULTITHREADED);
if (SUCCEEDED(CoCreateInstance (CLSID_ImagingFactory,
NULL,
CLSCTX_INPROC_SERVER,
IID_IImagingFactory,
(void **)&pImgFactory)))
{
// Load the image from the JPG file.
if (SUCCEEDED(pImgFactory->CreateImageFromFile(Name, &pImage)))
{
pImage->Draw(*hdc, &rc, NULL);
pImage->Release();
}
pImgFactory->Release();
}
CoUninitialize();}
我甚至尝试创建一个win32 dll并从C#app调用它,但我不能。 任何人都可以帮我解决这个问题吗?
答案 0 :(得分:2)
当然可以。你加载了一个图像,然后试图显示整个图像。为此,CF必须将其转换为显示驱动程序的位图。 3264x2448x16bpp ==接近16MB。您应该做的是generating a thumbnail并将 绘制到矩形中。
和往常一样,智能设备框架already has this done for you。
答案 1 :(得分:0)
虽然您不想使用OpenNETCF,但无论如何我都会提供它:
This似乎正是您所经历的。
不得不承认我自己也没试过 - 只是用Google搜索了一下。
答案 2 :(得分:-1)
你需要为它增加内存限制...... 用不同的语言(PHP)遇到类似的问题,一旦内存限制增加到25mb。 它解决了一个问题。