Форум сайта python.su
Стоит задача разрубить JPG больших (или очень больших - до 200Мб) размеров на кучу маленьких JPEGчегов (скажем 256х256 пикселей).
Проблема в том, что подобная возможность должна быть на любом устройстве: PC (Windows,Linux) (не проблема), Nokia N8x0 (Linux Maemo) - 40-70Мб ОЗУ, Nokia Series60 - 15-80Мб ОЗУ.
Пока в качестве варианта решения задачи, вижу подробное изучение формата JPG и чтение нужных блоков из большого файла (изображение JPG состоит из кусочков 8х8 пикселей), но это очень времязатратное занятие
Вопрос: может быть есть библиотека, позволяющая узнавать размеры изображения JPG, не загружая файл (уверен, что такое есть) и загружать кусок изображения по его координатам (очень сомневаюсь, но очень хочется).
Отредактировано (Окт. 30, 2008 16:52:31)
Офлайн
По поводу первого, это легко сделать при помощи pyexif.sourceforge.net
По поводу второго, думаю это возможно….
А зачем это, если не секрет? Для одноразового использования, это понятно.
Всвязи с разнообразием платформ, могу предположить что имеем в распоряжении карту? Может имеет смысл присмотреться к другим форматам?
Офлайн
RomarioМожет использовать libjpeg?
Пока в качестве варианта решения задачи, вижу подробное изучение формата JPG и чтение нужных блоков из большого файла (изображение JPG состоит из кусочков 8х8 пикселей), но это очень времязатратное занятие
RomarioРазмеры можно получить из заголовка jpeg файла. Для этого надо прочитать только его. Н-р с использованием libjpeg получится примерно следующее(правда на C =) ):
Вопрос: может быть есть библиотека, позволяющая узнавать размеры изображения JPG, не загружая файл (уверен, что такое есть)
#include <stdio.h>
#include <jpeglib.h>
int main()
{
FILE * infile;
struct jpeg_decompress_struct cinfo;
struct jpeg_error_mgr jerr;
cinfo.err = jpeg_std_error(&jerr);
jpeg_create_decompress(&cinfo);
infile = fopen("1.jpg", "rb");
jpeg_stdio_src(&cinfo, infile);
jpeg_read_header(&cinfo, TRUE);
printf("width: %i, height: %i\n", cinfo.image_width, cinfo.image_height);
jpeg_destroy_decompress(&cinfo);
return 0;
}
Офлайн
slivlenТак платформы то разные… PyEXIF pure-python и после небольшой дороботки напильником работает даже на series60.
Может использовать libjpeg?
Офлайн
igor.kaistlibjpeg вроде и под симбиан уже портировали. pure-python решение - это хорошо, но вот со скоростью могут быть проблемы на мобильных девайсах. Хотя лично я ее не замерял =)
Так платформы то разные… PyEXIF pure-python и после небольшой дороботки напильником работает даже на series60.
igor.kaistНе знаю, кнопку цитирования юзал =) Цитату поправил.
и что за глюк в твоем посте, это писал не я smile
Офлайн
slivlenЯ проверял, нормально :) всего то нужно,прочитать exif заголовки. Нет особенной разницы какого размера файл.
pure-python решение - это хорошо, но вот со скоростью могут быть проблемы на мобильных девайсах. Хотя лично я ее не замерял =)
Офлайн
Игорь, правильно угадал - карты. Собственно преобразование большого JPG в кучу маленьких - это необходимость думаю понятная. Будут ли эти маленькие JPGами или каким то другим форматом - еще не решал - посмотрю по ресурсоемкости и производительности. Возможно буду использовать GIF, так как 256 цветов будет более чем достаточно.
Всю эту гадость я затеял для того, чтобы создать кроссплатформенный и бесплатный аналог OziExplorer (кто не в курсе - это программа под Windows и Windows Mobile для работы с растровыми картами). Под Series60,80,UIQ такой аналог есть - это SmartComGPS, а вот под устройства на GNU/Linux - к сожалению не ничего даже близко стоящего. А мне оно очень нужно (да и людям думаю пригодиться).
К слову о вероятных форматах карт. В обоих озвученных мною программах изображение разбито на сегменты, которые подгружаются по мере необходимости отобразить их на экране. К тому же там содержатся уменьшенные копии изображений для оперативного маштабирования (иначе при попытки просмотреть всю карту на экране чего-либо, пришлось бы по сути, открывать целиком все квадраты).
Всем спасибо за помощь.
Офлайн
JPEG, после дискретно косинусного преобразрования, подвергается компрессии алгоритмами RLE (LZW?) и Huffman. Но я точно не знаю сжимаются фрагменты 8x8 или уже всё в кучу. Для тебя было бы лучше, если сжимались фрагменты. К тому прогрессивные JPEG (аналог черезстрочности для GIF) так же могут усложнить тебе жизнь, ибо данные одного участа изображения будут размазаны по всему файлу, тонкостей этого алгоритма не знаю.
Можно пойти другим путем. Некоторые библиотеки (PIL) по загрузке JPEG вполне сностно могут работать с битыми изображениями. Попробуй образать файл (не грузить весь), это позволит сэкономить память на размер оставшейся части файла, так как память под bitmap все же будет выделена в полном объеме. Хотя этот вопрос нужно изучать, разные библиотеки будут по разному себя вести.
..bw
Офлайн
Модуль graphics на симбиан не поддерживает gif. Только png и jpg. Может стоит использовать векторный формат. Не думал над этим? Скорость динамической отрисовки примитивов думаю должна быть выше, чем чтение сжатых графических файлов. Карты в каком формате? Может нет смысла переводить в другой формат, а использовать уже готовые карты. Кстати насчет симбиана могу помочь, есть опыт неплохой работы с ним.
Офлайн
PNG рулит =)
Офлайн