Большой цикл JPEG/PNG изображений
Я работал над своим проектом по обработке изображений с дистанционным зондированием и зацикливанию последовательности изображений. Каждое результирующее изображение (в формате JPEG или PNG) имеет приблизительно 8000 * 4000 пикселей. Наши пользователи обычно хотят зациклить последовательность изображений (более 50 изображений) на основе области интереса за один раз. Таким образом, я должен извлечь необходимую область просмотра из каждого изображения в соответствии с размером клиента визуализации пользователя. Например, если текущее клиентское представление пользователя составляет 640 * 480, мне потребуется найти блок данных размером 640 * 480 из каждого исходного изображения на основе текущих координат x (столбцы) и y (строки) и переназначить их в вид клиента Когда пользователь перемещается в другую область просмотра с помощью перетаскивания мышью, наша программа должна соответственно заново загрузить региональные данные из каждого исходного изображения как можно скорее.
Я знаю, что ни в библиотеке JPEG, ни в библиотеке PNG нет встроенных подпрограмм чтения блоков данных, таких как long ReadRectangle (long x0, long y0, long x1, long y1, char* RectData); длинный ReadInaRectangle (длинный x0, длинный y0, короткая ширина, короткая высота, символ * RectData);
Во встроенном JPEG-декомпрессоре отсутствует такая функциональность. Я знаю, что формат JPEG2000 имеет условия для распаковки определенной области изображения. Я не совсем уверен насчет JEPG.
Кто-то предлагает мне использовать CreateFileMapping, MapViewOfFile и CreateDIBSection, чтобы зафиксировать количество байтов сопоставления файла для сопоставления с представлением. В отличие от простых форматов плоских двоичных изображений, таких как *.raw, *.img и *.bmp, Blob в формате JPEG будет содержать не только данные изображения, но и сложный заголовок JPG. Поэтому непросто отобразить блок представления данных из файла JPEG.
Кто-то рекомендует мне использовать мозаику изображений или технологию пирамид изображений для генерации подизображений, как это делают многие популярные, визуализация изображений (Google Планета Земля и т. Д.) И приложения ГИС (WebGIS и т. Д.).
Как я могу решить эту проблему?
Спасибо за вашу помощь.
Голден Ли
2 ответа
Если у вас все в порядке с координатами региона, кратными 8, библиотека JPEG от ijg может помочь вам загрузить частичные изображения JPEG.
Вы хотели бы:
- Получить все коэффициенты DCT для всего изображения. Вот пример того, как это сделать. Да, это потребует энтропийного декодирования всего изображения, но это менее дорогой этап декодирования JPEG (IDCT является самым дорогим, и мы его избегаем).
- Выбросьте блоки, которые вам не нужны (каждый блок состоит из 8x8) коэффициентов. Вы должны будете сделать это вручную, но так как компоновка довольно проста (блоки расположены в порядке сканирования), это не должно быть так сложно.
- Примените блок обратного DCT к каждому из кадров. Вы, вероятно, можете заставить IJG сделать это для вас. Если вы не можете, то вам придется сделать свой собственный IDCT и преобразовать цвет обратно в [0, 255], потому что интенсивности в [-127, 128] в мире JPEG.
- Если все пойдет хорошо, вы получите декодированное изображение JPEG. Из-за подвыборки цветности каналы яркости и цветности могут иметь разные размеры, и вам придется компенсировать это самостоятельно путем масштабирования.
Первые два шага в значительной степени покрыты ссылками. Четвертый - довольно тривиальный (вы можете получить тип подвыборки цветности с помощью интерфейса IJG, а масштабирование - по сути, повышающая дискретизация - легко достигается с помощью чего-то вроде OpenCV или прокручивания собственного кода). Третий - то, что я еще не пробовал, но, похоже, это будет возможно.
Это легко с библиотекой GD. LibGD - это библиотека с открытым исходным кодом для динамического создания изображений программистами на лету.