Задача: Кэширование изображения C++
Дано:
Монохромное изображение, превышающее объем ОП, формата BMP или PNG.
Объем ОП на тестовой машине 1Gb, размер изображения 75108x13883 px.
Требуется:
Программа для стабильного и достаточно быстрого просмотра данного изображения.
Возможности: масштабирование изображения (не кратное 2 в обе стороны) и обычный скролбар.
Тестовое изображение: http://dottedmag.net/images/a.png (~12Mb) качать, браузер не открывает так-же как и проводник Windows :)
открывает: фотошоп, IrfanView, GIMP, автокад
преобразовывай JPEG в JTIP (JPEG Tiled Image Pyramid)
В силу некоторых особенностей ТЗ, я использовал Pyramidal tiling. TIFF'ы размером 100k-150к пикселей оно переваривало нормально. Дальше сами файлы получались более 4Gb и возникали другие проблемы, решать которые на 32-битной платформе нецелесообразно. Тебя скорее всего это ограничение не коснется.
http://www.boost.org/doc/libs/1_38_0/libs/gil/doc/index.html
Хотя я сам с этой библиотекой не работал. В приведенных на сайте примерах вводится файл, изменяется, сохраняется в новый. На счет вывода на экран - ничего не могу сказать.
Оффтопик: скоро будем прощать не только Оксотника, но и Леркина... хотя, возможно, дело тут в пятнице ;)
Погуглил на эту тему и нашел опэнсаурс проект библиотеки, которая как раз реализует решение этой задачи http://www.vips.ecs.soton.ac.uk/index.php?title=VIPS , но как реально использовать ее в моем проекте понятия не имею. NIPS - готовое решение с интерфейсом, но больно избыточно, мне как раз нужно окно VIEW этой программы :)
http://www.vips.ecs.soton.ac.uk/supported/7.16/win32/nip2-7.16.3.zip - с интерфейсом под NT
http://www.vips.ecs.soton.ac.uk/supported/7.16/nip2-7.16.4.tar.gz - собственно исходник
Компилируют они под виндой с помощью http://mingw.org/
Собственно вывод:
{
CDemoDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
Image* pImage = pDoc->GetImage();
if(NULL != pImage)
{
Graphics graphics(*pDC);
Status status = graphics.GetLastStatus();
if(Ok == status)
{
graphics.DrawImage(pImage, 0, 0,
pImage->GetWidth(), pImage->GetHeight());
}
}
}
СТАТЬЯ
ИСХОДНИК ПРОЕКТА