Ім'я файлу: КРЗ.docx
Розширення: docx
Розмір: 736кб.
Дата: 18.01.2022
скачати

Министерство образования и науки РФ

Федеральное государственное бюджетное образовательное

учреждение высшего образования

«Тульский государственный университет»

Факультет вечернего и заочного обучения

Кафедра «Информационная безопасность»

КОНТРОЛЬНО-КУРСОВАЯ РАБОТА

по дисциплине

"Системы мультимедиа, анимации и обработки изображений"

На тему: «Перевод графических форматов из JPEG в PDF»

Выполнил ст. гр. Б262592

____________ Кравчук К.Ф.

(подпись) (Ф.И.О. студента)

«_____» _____________20__ г.

Проверил доцент кафедры

____________ Первак И.Е.

(подпись) (Ф.И.О. преподавателя)

«_____» _____________20__ г.

Тула, 2021

Оглавление


Введение 3

1. Графические форматы и их преобразование 4

1.1. Виды графических форматов 4

2. Проектирование структуры и компонентов программного продукта 12

2.2.1. Проектирование форм 13

2.2.2. Проектирование кодов программного приложения 15

Заключение 16

Список использованной литературы 17

Приложения А. Тестирование работы программы 18

Приложение Б. Листинг текста программного приложения (основная форма) 21

Приложение В. Исходный код модуля конвертирования JPEGtoPDF 23


Введение


В условиях отсутствия стандартов каждый разработчик изобретал новый формат для собственных приложений. Поэтому возникали большие проблемы обмена данными между различными программами (текстовыми процессорами, издательскими системами, пакетами иллюстративной графики, программами САПР и др.). Но с начала 80-х гг. официальные группы по стандартам начали создавать общие форматы для различных приложений. Единого формата, пригодного для всех приложений, нет и быть не может, но всё же некоторые форматы стали стандартными для целого ряда предметных областей.

Формат графического файла - способ представления и расположения графических данных на внешнем носителе.

При подготовке файлов, например, для размещения в сети Интернет или по каким-либо другим причинам приходиться сталкиваться с проблемой преобразования графических файлов из одного формата в другой. Преобразование форматов графических файлов можно выполнить с помощью графических редакторов, воспринимающих файлы разных форматов. Возможны 4 типа преобразования файлов: преобразование одного растрового формата в другой; преобразование растрового формата в векторный; преобразование одного векторного формата в другой; преобразование векторного формата в растровый.

В данном курсовом проекте будет рассматриваться преобразование одного растрового формата в другой. Будет разработано приложение, которое должно конвертировать растровое изображение формата JPEG в межплатформенный формат электронных документов PDF. Проектирование приложения осуществляется в среде Borland Delphi.

1. Графические форматы и их преобразование

1.1. Виды графических форматов


Способ представления изображения оказывает влияние на возможности его редактирования, печати, на объем занимаемой памяти.

Все форматы графических файлов можно разделить на два типа:

- растровые;

- векторные.

Отличаются они принципом построения изображения.

В растровых изображениях картинка получается, из отдельных точек (пикселей), каждый из которых определяется двумя параметрами: координатами цветом и координатами расположения. Наиболее близкой аналогией растрового изображения является изображение на экране компьютерного монитора (или обычного телевизора), которое создает электронный луч, пробегающий последовательно по каждой строке формируемого кадра изображения (растра). Многие растровые форматы обладают способностью нести дополнительную информацию: различные цветовые модели изображения, вектора, альфа-каналы (дополнительный канал, с помощью которого можно сохранять выделенные или прозрачные области изображения), слои различных типов, интерлиньяж (возможность чересстрочного показа изображения), анимацию, возможности сжатия и многое другое. Достоинства растровых изображений в их способности передать тончайшие нюансы изображения, а также в широчайших возможностях по его редактированию, выражающихся в простом доступе к каждому пикселю изображения, возможности индивидуального изменения каждого из его параметров. Принципиальный недостаток один - очень большие размеры полученного файла.

Векторное изображение представляет собой совокупность отрезков кривых линий, которые описываются математическими выражениями, и цветных заливок. Проще говоря, чтобы компьютер нарисовал прямую линию, нужны координаты двух точек, которые соединяются по кратчайшему пути, для дуги задаются координаты центра окружности и радиус и т.д. Таким образом, векторная иллюстрация - это набор геометрических примитивов (простейших объектов, таких как линии, окружности, многогранники и тому подобное), использующихся для создания более сложных изображений.

Форматы графических файлов определяют способ хранения информации в файле (растровый или векторный), а также форму хранения информации (используемый алгоритм сжатия).

Сжатие применяется для растровых графических файлов, так как они имеют обычно достаточно большой объем. При сжатии графических файлов алгоритм сжатия включается в формат графического файла.

Существуют различные алгоритмы сжатия, причем для различных типов изображения целесообразно применять подходящие типы сжатия.

1.2. Формат JPEG


JPEG (англ. Joint Photographic Experts Group, по названию организации-разработчика) — один из популярных растровых графических форматов, применяемый для хранения фотоизображений и подобных им изображений. Файлы, содержащие данные JPEG, обычно имеют расширения (суффиксы) .jpg, .jfif, .jpe или .jpeg. Однако из них .jpg является самым популярным на всех платформах. MIME-типом является image/jpeg.

Алгоритм JPEG позволяет сжимать изображение как с потерями, так и без потерь (режим сжатия lossless JPEG). Поддерживаются изображения с линейным размером не более 65535 × 65535 пикселей.

Алгоритм JPEG в наибольшей степени пригоден для сжатия фотографий и картин, содержащих реалистичные сцены с плавными переходами яркости и цвета. Наибольшее распространение JPEG получил в цифровой фотографии и для хранения и передачи изображений с использованием сети Интернет.

Формат JPEG в режиме сжатия с потерями малопригоден для сжатия чертежей, текстовой и знаковой графики, где резкий контраст между соседними пикселями приводит к появлению заметных артефактов. Такие изображения целесообразно сохранять в форматах без потерь, таких как JPEG-LS, TIFF, GIF, PNG или использовать режим сжатия Lossless JPEG.

JPEG (как и другие форматы сжатия с потерями) не подходит для сжатия изображений при многоэтапной обработке, так как искажения в изображения будут вноситься каждый раз при сохранении промежуточных результатов обработки.

При сжатии изображение преобразуется из цветового пространства RGB в YCbCr. Следует отметить, что стандарт JPEG (ISO/IEC 10918-1) никак не регламентирует выбор именно YCbCr, допуская и другие виды преобразования (например, с числом компонентов, отличным от трёх), и сжатие без преобразования (непосредственно в RGB), однако спецификация JFIF (JPEG File Interchange Format, предложенная в 1991 году специалистами компании C-Cube Microsystems, и ставшая в настоящее время стандартом де-факто) предполагает использование преобразования RGB->YCbCr.

После преобразования RGB->YCbCr для каналов изображения Cb и Cr, отвечающих за цвет, может выполняться «прореживание» (subsampling), которое заключается в том, что каждому блоку из 4 пикселов (2х2) яркостного канала Y ставятся в соответствие усреднённые значения Cb и Cr (схема прореживания «4:2:0»). При этом для каждого блока 2х2 вместо 12 значений (4 Y, 4 Cb и 4 Cr) используется всего 6 (4 Y и по одному усреднённому Cb и Cr). Если к качеству восстановленного после сжатия изображения предъявляются повышенные требования, прореживание может выполняться лишь в каком-то одном направлении — по вертикали (схема «4:4:0») или по горизонтали («4:2:2»), или не выполняться вовсе («4:4:4»).

К недостаткам сжатия по стандарту JPEG следует отнести появление на восстановленных изображениях при высоких степенях сжатия характерных артефактов: изображение рассыпается на блоки размером 8x8 пикселей (этот эффект особенно заметен на областях изображения с плавными изменениями яркости), в областях с высокой пространственной частотой (например, на контрастных контурах и границах изображения) возникают артефакты в виде шумовых ореолов. Следует отметить, что стандарт JPEG (ISO/IEC 10918-1, Annex K, п. K.8) предусматривает использование специальных фильтров для подавления блоковых артефактов, но на практике подобные фильтры, несмотря на их высокую эффективность, практически не используются.

Однако, несмотря на недостатки, JPEG получил очень широкое распространение из-за достаточно высокой (относительно существовавших во время его появления альтернатив) степени сжатия, поддержке сжатия полноцветных изображений и относительно невысокой вычислительной сложности.

1.3. Формат PDF


Portable Document Format (PDF) — межплатформенный формат электронных документов, разработанный фирмой Adobe Systems с использованием ряда возможностей языка PostScript. В первую очередь предназначен для представления полиграфической продукции в электронном виде. Для просмотра существует множество программ, а также официальная бесплатная программа Adobe Reader. Значительное количество современного профессионального печатного оборудования имеет аппаратную поддержку формата PDF, что позволяет производить печать документов в данном формате без использования какого-либо программного обеспечения. Традиционным способом создания PDF-документов является виртуальный принтер, то есть документ как таковой готовится в своей специализированной программе — графической программе или текстовом редакторе, САПР и т. д., а затем экспортируется в формат PDF для распространения в электронном виде, передачи в типографию и т. п.

Формат PDF позволяет внедрять необходимые шрифты (построчный текст), векторные и растровые изображения, формы и мультимедиа-вставки. Поддерживает RGB, CMYK, Grayscale, Lab, Duotone, Bitmap, несколько типов сжатия растровой информации. Имеет собственные технические форматы для полиграфии: PDF/X-1a, PDF/X-3. Включает механизм электронных подписей для защиты и проверки подлинности документов. В этом формате распространяется большое количество сопутствующей документации.

Чаще всего PDF-файл является комбинацией текста с растровой и векторной графикой, реже — текста с формами, сценариями на языке JavaScript, 3D-графикой и другими типами элементов.

Информационные объёмы двух одинаково выглядящих на экране PDF-документов могут значительно отличаться в зависимости от:

- внедрения или связывания шрифтов и мультимедиа;

- разрешения растровых изображений;

- использования встроенного механизма сжатия всего документа;

- используемых алгоритмов сжатия растровых изображений.

Преимущества и недостатки.

Плюсы:

— стандартизованность и популярность: открывается на любых устройствах с любыми операционными системами ровно в том виде, в котором был создан;

— средство просмотра PDF формата, Adobe Acrobat Reader, часто предустановлено на компьютер, если устройство поставлялось с операционной системой. Если же нет – он доступен для скачивания с сайта разработчика Adobe Systems и это совершенно бесплатно;

— занимает мало места на жестком диске, потому что поддерживает множество алгоритмов компрессии;

— безопасность: пользователь может настроить параметры безопасности для своего PDF файла, например, запрет печати, запрет редактирования, использование электронной подписи для определения подлинности документа и т.д.

Минусы:

— редактор PDF файлов – платный;

— редактировать pdf файлы в специализированных программах, сложнее, чем любые другие графические файлы;

— сложно работать с текстом в PDF файлах, он воспринимается как картинка.

1.4. Преобразование графических форматов


Возможны 4 типа преобразования файлов:

- преобразование одного растрового формата в другой;

- преобразование растрового формата в векторный;

- преобразование одного векторного формата в другой;

- преобразование векторного формата в растровый.

Дальше рассмотрим только преобразование одного растрового формата в другой. Он обычно самый простой и без проблемный. Преобразование растрового файла заключается в считывание массива пикселей, организованных определенным образом, и в записи их с другим методом реализации. Нужно воспользоваться встроенным конвертом графического редактора. В случае значительного числа преобладаемых файлов целесообразно воспользоваться специальной программой – переводчиком, который понимает, во-первых, очень большое число форматов, во-вторых, позволяет работать в пакетном режиме. Файлы растрового формата обычно имеют очень большую структуру. Проблемы считывания могут возникнуть для растровых форматов с более сложной структурой, таким является формат TIFF, который был разработан для хранения большого разнообразия информации, поэтому имеет очень гибкую структуру. Гибкость структуры часто приводит к таким вариациям форматов, которые не могут читаться многими программами. Программы, пытающиеся открыть такой файл, либо выдают сообщение об ошибке, либо считывает искаженные изображения. (Paint Shop Pro).

После считывания файла, программа записывает его содержимое в новом формате. Однако, изображение в новом файле может сильно отличаться т исходного. При конвертировании файла информация теряется. Обычно, искажение изображения в новом файле происходит из-за утери информации; связанной с цветом пикселей. Чаще всего это происходит, когда исходный файл имеет возможность работать с большим количеством цветов. При конвертировании файла с большим числом цветов в файл с меньшим числом цветов, меняется информация о цвете каждого пикселя. При этом возможно два варианта: в простейшем случае компьютер читает каждый пиксель, вычитывает наиболее близкий к нему цвет из нового ограниченного набора и записывает его в файл назначения с новым цветом. Многие программы решают проблему – количества цветов, матрицированием цвета, т. е. когда пиксели преобразовываются в узоры из доступных цветов, с помощью которых делается попытка эмулировать цвет оригинала. При матрицировании, программа считывает большую часть изображения (обычно квадратную область из нескольких пикселов) и создает узор, имитирующий цвет этого маленького участка. Например, если область закрашена однородным серым цветом, а новый формат поддерживает только черный и белый цвета, то серый цвет имитируется набором черных и белых точек. Узоры матриц в разных программах сильно различаются. Некоторые программы дают возможность выбора узора.

2. Проектирование структуры и компонентов программного продукта

2.1. Разработка интерфейса пользователя


Программа выполнена в дружественном пользователю интерфейсе с поясняющими надписями на кнопках. Интерфейс максимально прост и удобен. Окно программы содержит базовый функционал, состоящий из кнопок (Button) и массив строк (ListBox).

При загрузке программы загружается главное окно, в котором содержаться все кнопки для действий. Пользователь может открыть один или сразу несколько JPEG-файлов и затем сохранить их в формате PDF.

2.2. Разработка и описание программного продукта

2.2.1. Проектирование форм


При проектировании главной формы было принято решение максимально упростить её внешний вид для более простого управления, ведь функционал программы не велик.

Готовая форма приложения изображена на рисунке 1.



Рис.1 Разработанная форма приложения

На форме расположились три компонента Button, простые командные кнопки. С их помощью реализуется команды в программе, с помощью обработчиков событий. Далее компонент ListBox – массив строк, служит для хранения и обработки текстовой информации. В данном приложении этот компонент отображает расположение загруженных файлов для преобразования.

Также на форме присутствуют компоненты OpenPictureDialog и SaveDialog для открытия фалов изображений и сохранения файлов соответственно. При запуске программы на исполнение визуально эти компоненты на форме не видны.

На рисунке ниже изображен диалог открытия графического файла.



Рис.2 Диалог открытия графического файла

2.2.2. Проектирование кодов программного приложения


Основой данной программы является сборник стандартных библиотек Delphi, которые позволяют загружать и сохранять базовые графические файлы. Тем не менее, данные библиотеки позволяют лишь загружать, но не создавать новые файлы.

Библиотека представляет собой коллекцию модулей из различных проектов и пользовательских дополнений.

Для работы с JPEG изображениями в Delphi предусмотрено два класса TJpegImage и TJpegData, которые описаны в модуле JPEG, соответственно данный модуль был подключен в первую очередь.

Модуль JPEGtoPDF предназначен для конвертирования самих форматов. В модули имеются функции для преобразования как одного графического файла, так и нескольких.

Полный листинг программного приложения, а также исходный код модуля JPEGtoPDF приведены в приложениях ниже.

Заключение


Данный курсовой проект разработан для создания конвертера графических форматов. Конвертер выполняет преобразование из графического формата JPEG в формат PDF. Функционал созданного приложения не велик, но зато интерфейс весьма прост и понятен. Имеется возможность преобразования как одного файла изображения, так и нескольких изображений в один PDF файл.

Список использованной литературы


  1. Багриновский, К.А. Новые информационные технологии / К.А.Багриновский, Е.Ю.Хрусталев. – М.: ЭКО, 2007. – 250с.

  2. Культин, Н.А. «Основы программирования в Delphi 7» /Н.А. Культин. -М, 2003г.

  3. Назаров, С.В. Компьютерные технологии обработки информации / Под ред. С.В. Назарова. - М.: Финансы и статистика, 2005. – 248 с.

  4. Фаронов, В.В. Delphi 6.0. Начальный курс. Учебное пособие /В.В. Фаронов.— М.: Юрайт.,2002.

  5. Шалкина, Т.Н. «Электронные учебно-методические комплексы: проектирование, дизайн» /Т.Н. Шалкина. -2008

  6. Delphi.int.ru — Портал программистов [Электронный ресурс]. – Режим доступа: http://www.delphi.int.ru . - Заглавие с экрана.

  7. Delphi-Help - Первая помощь программисту Delphi [Электронный ресурс]. – Режим доступа: http://delphi-help.ru .- Заглавие с экрана.


Приложения А. Тестирование работы программы


При запуске программы активна только одна кнопка – Open.



Рис.1 Запущенная программа

Нажмем кнопку Open и выберем какое-нибудь графическое изображении.



Рис.2 Диалоговое окно «Открыть»

После выбора файла в компоненте ListBox появляется запись с расположением выбранного файла.



Рис.3 Запущенная программа

Далее нажмем кнопку «Convert to PDF». Открывается диалоговое окно «Сохранить как».



Рис.4 Запущенная программа

После введения имени файла нажимаем сохранить. При успешной конвертации файла и успешного сохранения выдается соответствующее сообщение.



Рис.5 Сообщение об успешной конвертации

Проверим созданный PDF файл.



Рис. Созданный PDF файл.

Программа работает исправно.

Приложение Б. Листинг текста программного приложения (основная форма)

unit Unit1;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, ExtDlgs, StdCtrls,ExtCtrls, jpeg;

type

TForm1 = class(TForm)

btn1: TButton;

btn2: TButton;

lst1: TListBox;

dlgOpenPic1: TOpenPictureDialog;

dlgSave1: TSaveDialog;

btn3: TButton;

procedure btn1Click(Sender: TObject);

procedure btn3Click(Sender: TObject);

procedure btn2Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

Form1: TForm1;

implementation

uses

JPEGtoDPF;

{$R *.dfm}

procedure TForm1.btn1Click(Sender: TObject);

var i: integer;

begin

if dlgOpenPic1.Execute then for i:=0 to dlgOpenPic1.Files.Count-1 do lst1.Items.Add(dlgOpenPic1.Files[i]);

btn2.Enabled:=lst1.Count<>0;

btn3.Enabled:=lst1.Count<>0;

end;

procedure TForm1.btn3Click(Sender: TObject);

begin

if lst1.SelCount<>0 then lst1.DeleteSelected;

btn2.Enabled:=lst1.Count<>0;

btn3.Enabled:=lst1.Count<>0;

end;

procedure TForm1.btn2Click(Sender: TObject);

var k: integer;

begin

if dlgSave1.Execute then

begin

k:=ListJPGtoPDF(lst1.Items, dlgSave1.FileName);

case k of

ERR_OK: MessageDlg(#13'Конвертирование завершено',mtInformation,[mbOk],0);

ERR_SAVE: MessageDlg(#13'Невозможно записать в выходной файл',mtError,[mbOk],0);

ERR_ABORTED: MessageDlg(#13'Неизвестная ошибка',mtError,[mbOk],0);

else

MessageDlg(#13'Проблема во время открытия файла''image n°'+inttostr(k)+'.',mtError,[mbOk],0);

end;

end;

end;

end.

Приложение В. Исходный код модуля конвертирования JPEGtoPDF

unit JPEGtoDPF;

interface

uses

Windows,Classes, Graphics, SysUtils;

const ERR_SAVE=-1;

ERR_OK=-2;

ERR_ABORTED=-3;

// Преобразует файл JPG в файл PDF

function JPGtoPDF(FileName, SaveName:String): integer;

// Преобразует список файлов JPG в один файл PDF

function ListJPGToPDF(ListJPG: TStrings ; SaveName:String): integer;

{ Каждая функция возвращает :

- ERR_OK если произошло создание файла

- ERR_SAVE если невозможно записать в выходной файл

- ERR_ABORTED в случае непредвиденной ошибки при создании PDF-файла

- для JPGtoPDF : 0 если файл для вставки поставио проблему

- для ListeJPGtoPDF : любое положительное значение, указывающее индекс файла, который представлял проблему, когда он был вставлен

}

implementation

procedure Write_CrossReferenceTable(AStream: TStream; PosArray : array of Dword;Count:Integer);

Var

i :Integer;

begin

With TStringStream(AStream) do

begin

WriteString('xref'#10);

WriteString(Format('0 %d'#10,[Count+1]));

WriteString('0000000000 65535 f '#10);

for i:= 0 to Count-1 do

begin

WriteString(Format('%0.10d',[PosArray[i ]])+' 00000 n '#10);

end;

end;

end;

procedure Write_ContentsObject(AStream: TStream; Index : Dword; Width,Height : Integer);

Var

MemoryStream : TMemoryStream;

begin

MemoryStream:=TMemoryStream.Create;

Try

// Stream

With TStringStream(MemoryStream) do

begin

WriteString('q'#10);

WriteString(Format('%d 0 0 %d 0 0 cm'#10,[Width,Height]));

WriteString('/Im0 Do'#10);

WriteString('Q'#10);

end;

MemoryStream.Position:=0;

// Object

With TStringStream(AStream) do

begin

WriteString(Format('%d 0 obj'#10,[Index]));

WriteString(Format('<< /Length %d >>'#10,[MemoryStream.Size]));

WriteString('stream'#10);

AStream.CopyFrom(MemoryStream,MemoryStream.Size) ;

WriteString('endstream'#10);

WriteString('endobj'#10);

end;

finally

MemoryStream.Free;

end;

end;

function SwapEndian(S :word):word;

begin

Result :=(S and $00FF) shl 8 + (S and $FF00) shr 8 ;

end;

function GetJPEGSize(FileName:String;var AWidth,AHeight:Integer;var CMYK :Boolean):Boolean;

var

wrk : Word ;

Sampling : Byte;

AStream : TStream;

const

SOF0 : Word = $FFC0; // Normal

SOF2 : Word = $FFC2; // Progressive

begin

Result := False;

try

AStream := TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite);

try

// JFIF

AStream.ReadBuffer(wrk,2); wrk:=SwapEndian(wrk);

if wrk<>$FFD8 then Exit;

While True do

begin

AStream.ReadBuffer(wrk,2); wrk:=SwapEndian(wrk);

// JPEG Maker

if (wrk= SOF0) or (wrk= SOF2) then

begin

// Пропустить длину сегмента

AStream.Position:= AStream.Position+2;

// Пропустить образец

AStream.Position:= AStream.Position+1;

// Height

AStream.ReadBuffer(wrk,2); AHeight :=SwapEndian(wrk);

// Width

AStream.ReadBuffer(wrk,2); AWidth :=SwapEndian(wrk);

// ColorMode

AStream.ReadBuffer(Sampling,1);

case Sampling of

3 : CMYK :=False; // RGB

4 : CMYK :=True // CMYK


else Break; // ???

end;

Result :=True;

Break;

end

else if (wrk=$FFFF) or (wrk=$FFD9) then

begin

Break;

end;

// Пропустить сегмент @

AStream.ReadBuffer(wrk,2); wrk:=SwapEndian(wrk);

AStream.Position:= AStream.Position+(wrk-2);

end;

finally

AStream.Free;

end;

except end;

end;

function JPGtoPDF(FileName, SaveName:String): integer;

var List: TStringList;

begin

List:=TStringList.Create;

List.Add(FileName);

result:=ListJPGToPDF(List, SaveName);

List.Free;

end;

function ListJPGToPDF(ListJPG: TStrings ; SaveName: string): integer;

type TInfosJPG=record

CMYK: boolean;

W, H: integer;

end;

var

InfosJPG: array of TInfosJPG;

AStream,JPGStream : TStream;

ObjectIndex, W, H : Integer;

CMYK: boolean;

ObjectPosArray : array of Dword;

i: integer;

Bon: bool;

begin

if SaveName='' then

begin

result:=ERR_SAVE;

exit;

end

else

begin

Bon:=true; i:=0;

while (i
begin

if (ListJPG[i ]='') or not FileExists(ListJPG[i ]) or not GetJPEGSize(ListJPG[i ],W,H,CMYK) then Bon:=false else

begin

Setlength(InfosJPG, length(InfosJPG)+1);

InfosJPG[length(InfosJPG)-1].CMYK:=CMYK;

InfosJPG[length(InfosJPG)-1].W:=W;

InfosJPG[length(InfosJPG)-1].H:=H;

Inc(i);

end;

end;

if not Bon then

begin

result:=i;

Setlength(InfosJPG, 0);

exit;

end;

end;

ObjectIndex :=0;

try

AStream:=TFileStream.Create(SaveName,fmCreate);

except

result:=ERR_SAVE;

exit;

end;

Setlength(ObjectPosArray, 3*length(InfosJPG)+3);

try

// PDF version

TStringStream(AStream).WriteString('%PDF-1.2'#10);

// Catalog

ObjectPosArray[ObjectIndex] :=AStream.Position;

With TStringStream(AStream) do

begin

WriteString(Format('%d 0 obj'#10,[ObjectIndex+1]));

WriteString('<<'#10);

WriteString('/Type /Catalog'#10);

WriteString('/Pages 2 0 R'#10);

WriteString('/OpenAction [3 0 R /XYZ -32768 -32768 1 ]'#10); // View Option (100%)

WriteString('>>'#10);

WriteString('endobj'#10);

end;

Inc(ObjectIndex);

// Parent Pages

ObjectPosArray[ObjectIndex] :=AStream.Position;

With TStringStream(AStream) do

begin

WriteString(Format('%d 0 obj'#10,[ObjectIndex+1]));

WriteString('<<'#10);

WriteString('/Type /Pages'#10);

WriteString('/Kids [ ');

for i:=0 to length(InfosJPG)-1 do WriteString(inttostr(ObjectIndex+2+i)+' 0 R ');

WriteString(']'#10);

WriteString('/Count '+inttostr(length(InfosJPG))+#10);

WriteString('>>'#10);

WriteString('endobj'#10);

end;

Inc(ObjectIndex);

// Kids Page

for i:=0 to length(InfosJPG)-1 do

begin

ObjectPosArray[ObjectIndex] :=AStream.Position;

With TStringStream(AStream) do

begin

WriteString(Format('%d 0 obj'#10,[ObjectIndex+1]));

WriteString('<<'#10);

WriteString('/Type /Page'#10);

WriteString('/Parent 2 0 R'#10);

WriteString('/Resources'#10);

WriteString('<<'#10);

WriteString('/XObject << /Im0 '+inttostr(i+length(InfosJPG)+3)+' 0 R >>'#10);

WriteString('/ProcSet [ /PDF /ImageC ]'#10);

WriteString('>>'#10);

WriteString(Format('/MediaBox [ 0 0 %d %d ]'#10, [InfosJPG[i ].W,InfosJPG[i ].H]));

WriteString('/Contents '+inttostr(i+2*length(InfosJPG)+3)+' 0 R'#10);

WriteString('>>'#10);

WriteString('endobj'#10);

end;

Inc(ObjectIndex);

end;

// XObject Resource

for i:=0 to length(InfosJPG)-1 do

begin

ObjectPosArray[ObjectIndex] :=AStream.Position;

With TStringStream(AStream) do

begin

WriteString(Format('%d 0 obj'#10,[ObjectIndex+1]));

WriteString('<<'#10);

WriteString('/Type /XObject'#10);

WriteString('/Subtype /Image'#10);

WriteString('/Name /Im0'#10);

WriteString(Format('/Width %d'#10,[InfosJPG[i ].W]));

WriteString(Format('/Height %d'#10,[InfosJPG[i ].H]));

WriteString('/BitsPerComponent 8'#10);

WriteString('/Filter [/DCTDecode]'#10);

if not InfosJPG[i ].CMYK then

WriteString('/ColorSpace /DeviceRGB'#10)

else

begin

WriteString('/ColorSpace /DeviceCMYK'#10);

WriteString('/Decode[1 0 1 0 1 0 1 0]'#10); // Photoshop CMYK (NOT BIT)

end;

JPGStream :=TFileStream.Create(ListJPG[i ], fmOpenRead or fmShareDenyWrite);

WriteString(Format('/Length %d >>'#10,[JPGStream.Size]));

WriteString('stream'#10);

AStream.CopyFrom(JPGStream,JPGStream.Size);

JPGStream.Free;

WriteString('endstream'#10);

WriteString('endobj'#10);

end;

Inc(ObjectIndex);

end;

// Contents Stream & Object

for i:=0 to length(InfosJPG)-1 do

begin

ObjectPosArray[ObjectIndex] :=AStream.Position;

Write_ContentsObject(AStream,ObjectIndex+1,InfosJPG[i ].W,InfosJPG[i ].H);

Inc(ObjectIndex);

end;

// CrossReferenceTable

ObjectPosArray[ObjectIndex] :=AStream.Position;

Write_CrossReferenceTable(AStream,ObjectPosArray,ObjectIndex);

// Trailer

With TStringStream(AStream) do

begin

WriteString('trailer'#10);

WriteString('<<'#10);

WriteString(Format('/Size %d'#10,[ObjectIndex+1]));

WriteString('/Root 1 0 R'#10);

WriteString('>>'#10);

WriteString('startxref'#10);

WriteString(Format('%d'#10,[ObjectPosArray[ObjectIndex]]));

WriteString('%%EOF');

end;

AStream.Free;

result:=ERR_OK;

except

result:=ERR_ABORTED;

AStream.Free;

end;

Setlength(ObjectPosArray, 0);

end;

end.
скачати

© Усі права захищені
написати до нас