| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Общие вопросы > Рисунок в файл |
| Автор: dimonskif 12.3.2006, 20:28 | ||
| Каким образом можно несколько рисунков (и не только рисунков) добавить в один файл один за другим, чтобы в последующем можно было их оттуда вытащить и пользоваться? я сделал так, но так только одна картинка
|
| Автор: Poseidon 12.3.2006, 21:07 |
| Несколько рисунков в один файл? Так это у тебя уже Gif-анимация получится. Или тебе не обязательно иметь возможность их отображать? В любом случае используй базу данных |
| Автор: dimonskif 12.3.2006, 21:49 |
| Фишка в том, что отображать собранными мне их не надо. Это вроде для того, чтобы они были все в одном файле. Прога открывает этот файл и считывает из него все рисунки и файлы, а потом наоборот. А базу данных использовать не хочу- с ней тягаться неудобно |
| Автор: Guedda 12.3.2006, 22:28 | ||||||||||||||||||
| И так, начнем... ЗАДАЧА: Мне нужно сделать, чтобы картинки сохранялись в один файл, и по требованию пользователя загружались из этого файла (например в память). И считывая картинки из памяти программа показывает их в TImage по порядку с заданным интервалом. Короче программа-слайдшоу. ОБЩИЙ ПЛАН: Придумываем свой формат файла (бинарный естественно). - Изображения ложатся в файл друг за другом. Считываются так же. - При чтении нужно знать, сколько занимает считываемая картинка. Варианты: а) писать перед каждой картинкой её размер (одно целое число); б) записать вначале список, содержащий размеры всех картинок, возможно, их смещения в файле. Первый способ самый простой и понятный. Но второй более универсальный. Он даёт возможность хранить список имеющихся изображений, возможность произвольного доступа к любой из них. Для начинающих лучше было бы избрать первый вариант. Но я тут предпочту второй. Не люблю тупиковых направлений. - Обычно в бинарных форматах, в самом начале, помещают заголовок файла. Сделаем и мы его. Запишем туда какую-то сигнатуру (чтобы проверять, что файл «свой») и количество изображений. Можно зарезервировать немного места для каких-то будущих расширений формата, например, добавление картинок без перезаписи файла. ФОРМАТ ФАЙЛА: Файл состоит из следующих частей, расположенных друг за другом 1. Заголовок
2. Список картинок Последовательность лежащих друг за другом записей :
Каждая запись описывает одну из картинок, лежащих в теле файла. Количество записей задаётся параметром RecordCount заголовка. Таким образом, длинна этой части файла SizeOf(TFileItemDescr) * RecordCount. 3. Тело файла, сами картинки. При записи сюда ложатся друг за другом картинки. Их местоположения записаны во 2-й части формата. Замечания а. Используются packed record, а не просто record для того, чтобы копилятор не пытался выравнивать поля, не вставлял «дырок» между ними. б. Строки можно хранить только как массив байтов или как короткие строки (указывается длинна). Если короткая строка, нужно иметь ввиду, что один байт отводится на хранение длинны строки. АЛГОРИТМ ЗАПИСИ Предполагаем, что у нас есть список файлов, содержащих картинки, которые нужно собрать в один файл «нашего» формата. Будем работать с файлом через TFileStream. Его интерфейс самый простой. 1. Описываем базовые переменные
Заполняем их
2. Открываем файл, пишем первые два блока. Второй блок пока пустой, мы просто зарезервируем место в файле.
3. Пишем картинки. Заведём для доступа к ним отдельный поток.
4. Сохранение списка Теперь 2-й блок нашего файла заполнен. Запишем его на место.
Всё. Файл записан. АЛГОРИТМ ЧТЕНИЯ 1. Открываем файл. Проверяем, что это «наш» файл, читаем список.
2. Чтение картинки. Наш формат файла предусматривает возможность чтения произвольной картинки
Ну вот, вроде бы и всё. Надеюсь, что этого будет достаточно, чтобы Вы разобрались и написали работающий код. Все фрагменты кода писались «с ума», т.е. могут содержать описки, ошибки. По поводу хранения в БД. Конечно, это тоже вариант. Скорее всего он даже даст более простую реализацию. Но по-моему, для такой простой задачи подключать БД – излишество. Тут никаких связей, поисков, только хранение данных в одной единственной табличке. |
| Автор: Alexeis 13.3.2006, 10:14 |
| Guedda, Зачем так сложно можно ведь в ресурс поместить или еще лучше в паинте склеить все справа налево сверху вниз тогда вообще можно будет их грузить при помощи TImageList одной командой. |
| Автор: Snowy 13.3.2006, 10:20 |
| http://forum.vingrad.ru/index.php?showtopic=40647&view=findpost&p=313213 |
| Автор: Guedda 13.3.2006, 10:21 |
| Я понимаю, что можно и в ресурс (чтобы все картинки были в программе), и по другому... Но человек попросил именно сохранить несколько картинок в один файл. И как, по-твоему, можно сохранить в файл ImageList с картинками быстрее, чем этот способ? ИМХО, код нормальный, удовлетворяющий требованию участника, который задал этот вопрос. |
| Автор: Snowy 13.3.2006, 10:22 |
| Если не торопит, то подожди недельку. Я как раз работаю над такой тулзой, которая собирает файлы в кучу и генерит код для работы с ними. |
| Автор: Alexeis 13.3.2006, 10:43 | ||
делается картинка на подобии этой http://alexei-s1.narod.ru/Image2.jpg А ImageList воспринимает ее как набор картинок одинакового (например 16х16) размера и позволяет обращатся к каждой. Способ создания не быстрый(в графическом редакторе) зато наглядный. |
| Автор: Guedda 13.3.2006, 18:22 |
| Я то это знаю... А если каждый раз прийдется? Заново постоянно перерисовывать картинки? |