Методика разработки сцен на PostScript Создание каталога изображений | Создание каталога изображенийЗадача
Есть много картинок, их необходимо расположить на странице в определенном порядке в Н столбцов по К рядов на каждой странице. Страницы отпечатать. Изображения храняться в JPEG-формате.
Другими словами, сделать каталог изображений
Решение
Сразу. Основное. Главное.
Будем придерживаться второго подхода, изложенного в статье "Методика разработки сцен". Он прост. Понятен. Экономит массу времени. Он оправдан.
Не убедительно? Тогда, подумайте - Вы занимаетесь решением конкретной проблемы! Нужно решение именно этой проблемы, а не решение вообще проблемы.
ПервоеРазместим все изображения в одном месте - в одной папке. Например, в папке c:/aaa/proj1. Там же будем сохранять созданные нами описания страниц. Спроектируем макет страницы, где укажем места для размещения изображений, подписей к ним, а также сопутсвующие оформительские элементы: рамочки изображений, номера страниц и проч. Прикинем количество рядов, строк. Примерные размеры основных элементов. Подчеркну, примерные размеры. Макет распадается на несколько независимых частей:
Основа макета - ячейка для размещения изображения. Придумаем ее дизайн. Например, такой: в левом нижнем и в правом верхнем углу разместим ограничивающие уголки, внизу ячейки - подпись к рисунку, а основное поле ячейки отведем под изображение. Таким образом, ячейка состоит из:
Можно считать, что страницу на простые составляющие мы разбили. Приступим теперь к их реализации. Подключим библиотеку:
(c:/aaa/bbb/lib-2.ps) run Путь записываем обратным слэшем /!! Зададим размер листа:
Страница.Формат.А4
ЯчейкаОпределим отводимое место под ячейку, ее параметры. Прикинем приблизительные значения параметров. Первое, для упрощения работы примем, что ячейка - это область прямоугольной формы. Второе, левый нижний угол ячейки разместим в начале координат, чтобы не возится с пересчетом координат. В нужное время перемести начало координат в нужную позицию оператором translate. Третье, оформим описание размещения элементов ячеки как отдельный оператор и он будет отвечать за рисование одной ячейки в начале координат. Назовем его НарисоватьЯчейку. Да, дадим ему русскоязычное название! Интерпретатор это позволяет. Но с начала определим зададим параметры ячейки.
Параметры ячейки
Определим, что нужно отобразить файл 01.jpg с подписью к нему Картинка:
/Ячейка.Файл (c:/aaa/proj1/01.jpg) def /Ячейка.Подпись (Картинка) def Обязательно! Указывайте полный путь к файлам изображений (через обратный слэш)! Размеры ячейки будут 80 мм на 100 мм:
/Ячейка..Ширина 80 мм def /Ячейка..Высота 100 мм def Определим, что поле для изображения - это прямоугольная область, отстоящая на одинаковом расстоянии от верхней, левой и правой границ. Отступ выберем равным 4 мм. Высоту поля примем равной 70 мм:
/Ячейка..Изображение.Отступ 4 мм def /Ячейка..Изображение.Высота 70 мм def Длину стороны выберем равной 10 мм:
/ДлинаСтороныУголка 10 мм def
Рисуем ячейкуГоворим, что ниже приведенный фрагмент кода рисует ячейку:
/Ячейка { Теперь нарисуем левый верхний уголок. Уголок определим тремя параметрами: координатами его угла и длиной стороны, учитывая что он симметричный и его стороны параллельны соответсвующим сторонам ячейки. Уголок нарисуем как два луча заданной длины исходящих из одной точки - угла уголка. Легко определить, что координаты угла - (0, Ячейка..Высота). Тогда, Устанавливаем параметры линий уголка: рисовать Уголок черной
1 setlinewidth тонкой линией
0 setgray говорим, что рисуем новую фигуру
newpath Указываем координаты (х, у) угла Уголка и перемещаем туда перо
0 Ячейка..Высота moveto Рисуем (0, -dу) прямую вертикально вниз
0 ДлинаСтороныУголка neg rlineto Начинаем рисовать второй луч из (х, у) угла Уголка
0 Ячейка..Высота moveto Рисуем (dх, 0) прямую горизонтально вправо
ДлинаСтороныУголка 0 rlineto Наводим
stroke Проверяем работу. Ок. Все работает
Аналогично, с учетом зеркальности, рисуем правый нижний угол:
1 setlinewidth 0 setgray newpath Ячейка..Ширина 0 moveto 0 ДлинаСтороныУголка rlineto Ячейка..Ширина 0 moveto ДлинаСтороныУголка neg 0 rlineto stroke Проверяем. Все просто чудесно. Для поля с изображением необходимо знать:
Изображение печатается в нужном месте командой printJPEG. Посмотрите в справочнике что она ожидает в качестве своих аргументов. Первым параметром printJPEG мы должны задать ширину области для изображения:
Ячейка..Ширина Ячейка..Изображение.Отступ sub Ячейка..Изображение.Отступ sub Надеюсь, понятно как расчитали Ширину. Далее, указываем высоту поля:
Ячейка..Изображение.Высота Указываем название файла с изображением, который нужно вывести
Ячейка.Файл Указываем координаты (х, у) левого нижнего угла поля. Сначала х:
Ячейка..Изображение.Отступ Теперь y:
Ячейка..Высота Ячейка..Изображение.Отступ sub Ячейка..Изображение.Высота sub Все параметры указаны, вызываем оператор отрисовки изображения:
printJPEG Проверяем... Работает. Но, выравнивает картинку по нижнему краю. Пока оставим.
Печатаем подпись к ячейке
Укажем каким шрифтом печатаем.
Шрифт.Ариал-Рус 5 мм Шрифт.Размер! Шрифт.Применить Укажем откуда начинаем печатать и что печатаем:
10 мм 8 мм moveto Ячейка.Подпись show О чудесно, все работает... Если что-то не нравится - подкоректируйте параметры. Ячейка готова:
} def
Рисуем макет страницы
Печать нижнего колонтитулаНарисуем нижний колонтитул, где будет размещаться номера страниц. Номер страницы указываем вручную. Тогда:
95 мм 10 мм moveto Шрифт.Ариал-Рус 6 мм Шрифт.Размер! Шрифт.Применить Указавем номер страницы
(- 1 -) show
Размещение и печать ячеекДля того чтобы нарисовать несколько ячеек на одном листе, достаточно каждый раз передвигать начало координат в новое место. Чтобы расположить четыре ячейки в два столбца и по два ряда сделаем так. Сначала переместим начало координат в нижний левый край листа с учетом полей (левое поле - 20мм, нижнее - 30мм):
20 мм 30 мм translate Печатаем нижний ряд
/Ячейка.Файл (c:/aaa/proj1/01.jpg) def /Ячейка.Подпись (Картинка 1) def Ячейка Передвинули начало координат в позицию для отрисовки следующей ячейки - на ширину уже нарисованной.
Ячейка..Ширина 0 translate Следующая
/Ячейка.Файл (c:/aaa/proj1/02.jpg) def /Ячейка.Подпись (Картинка 2) def Ячейка Между рядами сделаем промежуток 4 мм
0 Ячейка..Высота 4 mm add translate Верхний ряд
/Ячейка.Файл (c:/aaa/proj1/03.jpg) def /Ячейка.Подпись (Картинка 3) def Ячейка Ячейка..Ширина neg 0 translate /Ячейка.Файл (c:/aaa/proj1/04.jpg) def /Ячейка.Подпись (Картинка 4) def Ячейка Теперь говорим, что формирование страницы закончилось и ее нужно вывести
showpage Макет готов. Работает. Теперь формируем каждую страницу.
Формируем страницы каталогаСтраницы каталога формируем теперь по образу и подобию - первой страницы, описанной нами выше. Только подставляем нужные названия файлов и комментарии к ним
95 мм 10 мм moveto Шрифт.Ариал-Рус 6 мм Шрифт.Размер! Шрифт.Применить (- 2 -) show 20 мм 30 мм translate /Ячейка.Файл (c:/aaa/proj1/001.jpg) def /Ячейка.Подпись (Файл 001.jpg) def Ячейка Ячейка..Ширина 0 translate /Ячейка.Файл (c:/aaa/proj1/002.jpg) def /Ячейка.Подпись (Файл 002.jpg) def Ячейка 0 Ячейка..Высота 4 mm add translate /Ячейка.Файл (c:/aaa/proj1/003.jpg) def /Ячейка.Подпись (Файл 003.jpg) def Ячейка Ячейка..Ширина neg 0 translate /Ячейка.Файл (c:/aaa/proj1/004.jpg) def /Ячейка.Подпись (Файл 004.jpg) def Ячейка showpage Код страницы переупорядочен с целью выделения важных деталей - что выводить и с какой подписью. Также это сократило занимаемое им место на экране. Хотя код стал менее понятливым, зато набивать его данными стало проще, а код уже отработан! Третью страницу делаем аналогично - скопировали текст второй (шаблон, макет) внесли нужные данные и т.д.
95 мм 10 мм moveto Шрифт.Ариал-Рус 6 мм Шрифт.Размер! Шрифт.Применить (- 3 -) show 20 мм 30 мм translate /Ячейка.Файл (c:/aaa/proj1/005.jpg) def /Ячейка.Подпись (Файл 005.jpg) def Ячейка Ячейка..Ширина 0 translate /Ячейка.Файл (c:/aaa/proj1/006.jpg) def /Ячейка.Подпись (Файл 006.jpg) def Ячейка 0 Ячейка..Высота 4 mm add translate /Ячейка.Файл (c:/aaa/proj1/007.jpg) def /Ячейка.Подпись (Файл 007.jpg) def Ячейка Ячейка..Ширина neg 0 translate /Ячейка.Файл (c:/aaa/proj1/008.jpg) def /Ячейка.Подпись (Файл 008.jpg) def Ячейка showpage Все. Можно печатать.
Практические замечанияПри работе обратите внимание на следующие моменты. Удостоверьтесь что имена файлов и пути написаны Вами правильно. К сожалению, Ghostscript продвинутые форматы JPEG не понимает, поэтому изображения НЕ должны быть записаны в прогрессивном формате JPEG. А в остальном только Ваша внимательность!
Вместо вывода.Как видите ничего сложно. Только непривычно. Как и с любой новой технологией, главное начать. Текст программы можно взять отсюда |