【问题标题】:Getting out of memory exception when loading high resolution image with IImagingFactory使用 IImagingFactory 加载高分辨率图像时出现内存不足异常
【发布时间】:2010-12-04 00:10:47
【问题描述】:

我正在尝试加载高分辨率图像(如 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# 应用程序调用它,但我做不到。 谁能帮我解决这个问题?

【问题讨论】:

  • 你也已经问过这个问题了:stackoverflow.com/questions/1490652/…如果你对缩略图给你的调整结果不满意,那么你需要自己调整图像大小
  • ya.. matt.. 我被卡住了,我正在尝试一些方法:-(

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    虽然你不想使用 OpenNETCF,但我还是会提供它: This 似乎正是您所经历的。
    不得不承认我自己没有尝试过 - 只是用谷歌搜索了一下。

    【讨论】:

    • 我更彻底地阅读了我提供链接的帖子。似乎有一个解决方案的链接,其中包含本机代码中的源代码和调用它的托管代码。如果您尝试访问 Alex Feinman 的博客,请将 url 中的 .org 更改为 .com
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2011-06-18
      • 2013-09-09
      • 2012-05-08
      • 1970-01-01
      • 2015-02-19
      • 1970-01-01
      • 1970-01-01
      • 2011-02-11
      • 1970-01-01
      相关资源
      最近更新 更多