使用IImagingFactory加载高分辨率图像时出现内存异常

时间:2009-10-05 16:12:50

标签: c# windows-mobile mfc winapi compact-framework

我正在尝试加载高分辨率图像(如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调用它,但我不能。 任何人都可以帮我解决这个问题吗?

3 个答案:

答案 0 :(得分:2)

当然可以。你加载了一个图像,然后试图显示整个图像。为此,CF必须将其转换为显示驱动程序的位图。 3264x2448x16bpp ==接近16MB。您应该做的是generating a thumbnail并将 绘制到矩形中。

和往常一样,智能设备框架already has this done for you

答案 1 :(得分:0)

虽然您不想使用OpenNETCF,但无论如何我都会提供它: This似乎正是您所经历的。
不得不承认我自己也没试过 - 只是用Google搜索了一下。

答案 2 :(得分:-1)

你需要为它增加内存限制...... 用不同的语言(PHP)遇到类似的问题,一旦内存限制增加到25mb。 它解决了一个问题。