Привет! Имеется большое изображение формата 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. Подскажите, что делать в данной ситуации?
С Уважением, Андрей.
Здравствуйте, 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 )
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, HunteX, Вы писали:
HX>>Привет! Имеется большое изображение формата TIFF разрешением 30000х30000 1канал/8бит.
HX>>Задача состоит в получении части изображения и сохранении его в файл.
HX>>Использую GDI+ метод LockBits(), для сохранения части файл использую OpenCV.
HX>>При размерах изображения > 500MB метод LockBits() возвращает статус 'OutOfMemory'.
HX>>p.s. Подскажите, что делать в данной ситуации?
А>Можно заюзать LibTIFF с построчным чтением изображения, и самому формировать в памяти битмап.
Уже решил проблему при помощи GDAL, но спасибо за совет! Только вот libTIFF оставила нехорошие впечатления, особенно благодаря своей документации