Исключение из памяти при загрузке изображения высокого разрешения с помощью IImagingFactory - PullRequest
1 голос
/ 05 октября 2009

Я пытаюсь загрузить изображение с высоким разрешением (например, 3264x2448). Для этого я использую класс IImageFactory в C #. 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{}
}

Используя вышеприведенные исходные строки, я смог загрузить изображения, но мои попытки нарисовать изображение потерпели неудачу, выбросив ExOpMemory 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 #, но не смог. Может кто-нибудь помочь мне решить эту проблему?

Ответы [ 3 ]

2 голосов
/ 06 октября 2009

Конечно, это так. Вы загрузили изображение, а затем пытаетесь отобразить все это. Для этого CF должен превратить его в растровое изображение для драйвера дисплея. 3264x2448x16bpp == почти 16 МБ. Что вам нужно сделать, это создать миниатюру и нарисовать , что в прямоугольнике.

И, как обычно, Smart Device Framework уже сделал это для вас .

0 голосов
/ 05 октября 2009

Хотя вы не хотите использовать OpenNETCF, я все равно предложу это: Это кажется именно тем, что вы испытываете.
Должен признать, я сам не пробовал - просто немного погуглил.

0 голосов
/ 05 октября 2009

вам нужно увеличить лимит памяти для этого ... Получил похожую проблему с другим языком (PHP), однажды увеличил лимит памяти до 25 Мб. это решило проблему.

...