AlienEmperor
26.05.2005 10:21
Собственно, вопрос: мне нужно создать файл, содержащий описание (record) и произвольное число JPEG'ов, котороые получаются преобразованием из BMP-файлов... Для такого файла нужно сделать Header, в который поместить размер каждого файла (смещение от начала)... Можно ли как-нибудь узнать размер JPEG'а не сохраняя его на диск ?
Digitalator
27.05.2005 14:06
Первое что приходит на ум....
можно сохранить TJpegImage в TStream с помощью метода JpegImage.SaveToStream, а потом узнать размер в stream.size. Этот же stream можно будет позже использовать для записи в файл.
AlienEmperor
31.05.2005 8:56
В принцыпе, так я и сделал... Header сохраняет размер файла по разности до и после записи... Вроде работает... Блин, с битмапами намного проще, неужели они не могли в Header JPEG'а вставить его размер ?
Дело не в этом... просто JPEG это не только компрессия, но и формат записи файла. А в памяти для отображения картинки на экране изображение храниться в формате BMP, т.к. это стандарт при работе с GDI Windows-а. Поэтому если хочешь не сохраняя в файл получить в памяти JPEG структуру, то используй описанный метод - сохраняй в TMemoryStream.
AlienEmperor
31.05.2005 9:41
2hiv: дык, а так и сделал уже... Я с самого начала так сделал, когда еще вопрос даже не задал... Просто мне не очень нравится такой подход...
P.S. Кстати, в Delphi5 при использовании модуля JPEG и потоков, я обнаружил интересную фигню: при попытке считать файл из потока (MyJPEG1.LoadFromStream(MyStream)) в файл MyJPEG1 считываются ВСЕ JPEG'и из заданного потока... Пришлось из примеров выдирать JPEG.PAS и перекомпилировать его, перенеся метод ReadStream из Protected в Public..., там хотя бы указывается размер считываемой информации...
Цитата(AlienEmperor @ 31.05.05 9:41)
Просто мне не очень нравится такой подход...
Еще раз говорю - этот подход задает Билл Гейтс. Так что все эмоции к нему, а не в Delphi. К примеру у UNIX систем стандартным является PNG файл, который может иметь компрессию, но дело в том что библиотека компрессии zlib стандартно поставляется с системой и ей юзается. А нестандартные форматы формируются при сохранении.
AlienEmperor
1.06.2005 12:10
Цитата
Так что все эмоции к нему, а не в Delphi.
Что-то я не заметил в своем тексте эмоций к Delphi вообще (у меня к ней они вообще исключительно положительные)... Разве Inprise (Borland) формат JPEG придумали ? Что-то мне подсказывает, что и не Билли... В заголовке битмапа-то инфа о размере есть... Так и тут надо было сделать, вот я про что говорил. (При создании самого заголовка, он ведь есть не зависимо от того, записан файл на диск или нет - память-то используется).
Цитата
Пришлось из примеров выдирать JPEG.PAS и перекомпилировать его, перенеся метод ReadStream из Protected в Public...
Создай потомка типа JPEG (например MJPEG - движущегося JPEG) и переопредели методы ReadStream и WriteStream - вот и все! Красиво и все по ООП технологии.
AlienEmperor
1.06.2005 14:29
Цитата
Красиво и все по ООП технологии.
Согласен... В конечном варианте так и сделаю.
Благо там три строчки написать надо...
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста,
нажмите сюда.