2010-06-04 4 views
4

Я использую MFC/GDI и Stingray для отображения растровых изображений в своем приложении и ищу лучшего решения. В частности,Любая хорошая библиотека C++ для отображения больших растровых изображений

  • Быстрее скорость вытяжки - Мое текущее решение является медленным, на основе StretchDIBits
  • качества
  • Лучше рендеринга - StretchDIBits качество визуализации ужасен при масштабировании растрового изображения
  • Поддержка повернутых растровых изображений
  • Поддержка загрузки/сохранения во всех популярных форматах
  • Поддержка больших растровых изображений - я регулярно использую аэрофотоснимки размером ~ 64 МБ как 12 000 × 12 000 JPEG. поддержка GeoTIFF также будет полезным
  • Совместимость с MFC документ/представление, включая печать (например, должны быть в состоянии оказывать на CDC)
  • Доступ к исходному коду хорошо, но не обязательно
  • Простота в использовании/порт существующих GDI код

Хотя бесплатный всегда хороший, я не против тратить разумную сумму на приличную библиотеку, хотя стоимость гонорара не требуется. Googling предлагает следующее:

Каждый получил опыт этих или может порекомендовать хорошую альтернативу?

+2

Я вижу, что вы масштабируете JPEG более чем в 8 раз. В этом случае вы должны были сделать масштабирование на уровне JPEG, а не растровое изображение. Это * WAY * быстрее. JPEG сжимает блоки размером 8x8 пикселей с использованием компонентов Fourier. Компонент {0,0}, явно сохраненный, является средним значением. Следовательно, он очень быстрый и довольно тривиальный, чтобы уменьшить изображение JPEG в 8 раз.вы получите растровое изображение 1500 * 1500 из 12000 * 12000 пикселей JPEG, и, скорее всего, скорость вашего диска будет ограничивающим фактором. – MSalters

+0

@MSalters, хороший комментарий, и учитывая, что команда, которую я использую, является StretchDIBits, я предполагаю, что ваше высказывание истинно. Тем более разумно принять другой подход. –

ответ

2

Я думаю, маловероятно, что вы найдете что-то, что выполняет быстрее, чем GDI на окнах, так как оно поддерживает уровень ядра, чего не может найти решение с открытым исходным кодом.

Возможно, вы также захотите изучить OpenGL или Direct2D/Direct3D, так как они также имеют прямой доступ к буферу кадров. С 3D-API размер текстуры, вероятно, будет проблемой, поскольку большинство стандартов ограничивают что-то вроде 4096x4096.

+0

Я не уверен в скорости. Это может быть правдой, если я не масштабировал растровые изображения, но StretchDIBits не кажется настолько быстрым при масштабировании и рисовании растрового изображения 4000x4000 пикселей, скажем, в поле размером 300 × 300 пикселей. Это также приводит к ужасному результату. Следующее обсуждение скорости StretchDIBits также интересно http://www.gamedev.net/community/forums/topic.asp?topic_id=344785 –

+0

Перемещение всей партии OpenGL, безусловно, стоит рассмотреть, хотя это может потребовать много работы и создают проблемы на стороне печати. –

+0

StretchDIBits делает простое масштабирование ближайшего соседа. Для некоторых приложений это именно то, что вы хотите, и ничего больше. (например, для масштабирования редактора изображений) – shoosh

2

Я использовал в прошлом CxImage, который является одним из тех, которые добавляются в ваш оценочный список.

+0

+1 Отлично выглядит, спасибо за сообщение! –

3

GDI + доступен на любой машине Windows с ранней XP. Он имеет кодеки для всех популярных форматов изображений, включая JPEG. Очень хорошие фильтры для высококачественного масштабирования изображения. Неограниченное вращение изображения. Рисует CDC через класс Graphics. Исходный код для оберток C++ доступен в файлах заголовков SDK gdiplusXxx.h. Скорость, скорее всего, будет эквивалентной, а рендеринг - это программное обеспечение, обеспечивающее совместимость.

Вы можете использовать #include <gdiplus.h> и использовать обертки C++ напрямую. Документы SDK are here. Класс CImage доступен в MFC, однако он не раскрывает все возможности.

+0

+1 Это, вероятно, хороший первый шаг, так как это должен быть очень простой порт. Я имею в виду обменять GDI на GDI + некоторое время, так что теперь, вероятно, пора укусить пулю. –

Смежные вопросы