GDI+ не справляется с большими TIFF-изображениями :(
От: HunteX http://troyashka.ru/
Дата: 26.03.11 07:14
Оценка:
Привет! Имеется большое изображение формата TIFF разрешением 30000х30000 1канал/8бит.
Задача состоит в получении части изображения и сохранении его в файл.
Использую GDI+ метод LockBits(), для сохранения части файл использую OpenCV.
При размерах изображения > 500MB метод LockBits() возвращает статус 'OutOfMemory'.

Система: Windows 7 x64;
ОЗУ: 4GB;
IDE: VS2010 SP1;

Следующий код работает с изображениями до 500MB:

    ULONG_PTR gdiplusToken;
    GdiplusStartupInput gdiplusStartupInput;

    GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);

    int X = 0;
    int Y = 0;
    int WIDTH = 1000;
    int HEIGHT = 1000;
    Rect *region = new Rect(X, Y, WIDTH, HEIGHT);

    Bitmap *tiff = new Bitmap(L"veryBIG.tif");

    BitmapData *data = new BitmapData();
    Status retStatus = tiff->LockBits(region, ImageLockModeRead, PixelFormat8bppIndexed, data);

    // OpenCV code ========================================================================
    CvMat *matrix = cvCreateMatHeader(WIDTH, HEIGHT, CV_8UC1);
    cvSetData(matrix, data->Scan0, data->Stride);
    cvSaveImage("TEST4.tif", matrix);
    cvReleaseMat(&matrix);
    // ====================================================================================

    tiff->UnlockBits(data);

    delete[] data;
    delete[] tiff;

    GdiplusShutdown(gdiplusToken);


p.s. Подскажите, что делать в данной ситуации?
С Уважением, Андрей.
Re: GDI+ не справляется с большими TIFF-изображениями :(
От: bnk СССР http://unmanagedvisio.com/
Дата: 26.03.11 10:41
Оценка: 8 (1)
Здравствуйте, HunteX, Вы писали:

HX>Привет! Имеется большое изображение формата TIFF разрешением 30000х30000 1канал/8бит.

HX>При размерах изображения > 500MB метод LockBits() возвращает статус 'OutOfMemory'.
HX>p.s. Подскажите, что делать в данной ситуации?

Возможно ты зря взялся читать офигенные TIFF-ы с помощью gdiplus, и тебе попробовать специализированную библиотеку для этого, типа GDAL (работа с геодезическими и прочими данными высокого разрешения)?
Здесь есть статья, выглядит все достаточно просто:

Утилита:
>gdal_translate.exe -srcwin 10 10 50 50 -of BMP "input.tif" "output.bmp"

Библиотека:
gdalData = gdal.Open( "input.tiff" )
gdalBand = gdalData.GetRasterBand( 1 )
line = gdalBand.ReadAsArray( xoffeset, yoffset, xsize, ysize )
Re: GDI+ не справляется с большими TIFF-изображениями :(
От: Аноним  
Дата: 29.03.11 10:57
Оценка:
Здравствуйте, HunteX, Вы писали:

HX>Привет! Имеется большое изображение формата TIFF разрешением 30000х30000 1канал/8бит.

HX>Задача состоит в получении части изображения и сохранении его в файл.
HX>Использую GDI+ метод LockBits(), для сохранения части файл использую OpenCV.
HX>При размерах изображения > 500MB метод LockBits() возвращает статус 'OutOfMemory'.
HX>p.s. Подскажите, что делать в данной ситуации?

Можно заюзать LibTIFF с построчным чтением изображения, и самому формировать в памяти битмап.
Re[2]: GDI+ не справляется с большими TIFF-изображениями :(
От: HunteX http://troyashka.ru/
Дата: 29.03.11 11:01
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, HunteX, Вы писали:


HX>>Привет! Имеется большое изображение формата TIFF разрешением 30000х30000 1канал/8бит.

HX>>Задача состоит в получении части изображения и сохранении его в файл.
HX>>Использую GDI+ метод LockBits(), для сохранения части файл использую OpenCV.
HX>>При размерах изображения > 500MB метод LockBits() возвращает статус 'OutOfMemory'.
HX>>p.s. Подскажите, что делать в данной ситуации?

А>Можно заюзать LibTIFF с построчным чтением изображения, и самому формировать в памяти битмап.


Уже решил проблему при помощи GDAL, но спасибо за совет! Только вот libTIFF оставила нехорошие впечатления, особенно благодаря своей документации