21.4. Работа с изображениями
Класс TCanvas, который является основой графической системы Delphi, не содержит методов сохранения отрисованных изображений. Методы сохранения картинок имеют классы: TPicture, TGraphic и TBitMap. Поэтому сохранение изображений из класса TCanvas можно осуществлять, используя один из указанных выше классов. Приведем пример сохранения картинки из класса TCanvas объекта PaintBox1 в файл с помощью методов класса TBitMap:
psSolid
psDash
psDot
psDashDot
psDashDotDot
psClear
psInsideFrame
BsSolid BsCross
BsClear BsDiagCross
BsBDiagonal BsHorizontal
BsFDiagonal BsVertical
Var Bm:TBitMap; // Определяем указатель на растровую картинку
R:TRec; // Выделяем память под прямоугольник
Begin
Bm:=TBitMap.Create; // Выделяем память под растровую картинку
R:=PaintBox1. ClientRect; // Запоминаем размеры картинки
Bm.Width:=R.Right-R.Left+1; // Передаем эти размеры объекту Bm
Bm.Height:=R.Bottom-R.Left+1;
Bm.Canvas.CopyRect(R,PaintBox1.Canvas,R); // Копируем картинку в Bm
Bm.SaveToFile(’c:\my\pic1.bmp’); // Сохраняем картинку в файле
Bm.Free; // Освобождаем память выделенную объекту Bm
Операционная система Windows поддерживает только растровые картинки и файлы с расширением *.bmp. В этих файлах первые 14 байт определяют заголовок файла, следующие 40 байт – заголовок картинки (ширина, высота, разрешение по координатам для печати картинки, число цветовых плоскостей, число цветов в палитре, метод сжатия и т.д.).
Затем идет цветовая палитра, где каждый цвет имеет свой номер и занимает в палитре 4 байта. Далее идет само растровое изображение – построчное перечисление номеров цветов для каждого пикселя (точки на экране), причем строки растра идут снизу вверх и длина каждой строки кратна 4 байтам.
Система Delphi позволяет работать и с картинками в формате JPEG (расширения файлов *.jpg). Для этого в Delphi используется специальный модуль Jpeg. В этом формате вся картинка сначала разбивается на квадратики 8*8 или 16*16 пикселей. Исходная растровая картинка каждого квадратика преобразуется, как в телевидении, в яркостную и две цветоразностные плоскости. Каждая из плоскостей подвергается дискретному, двухмерному, быстрому преобразованию Фурье. В результате этого преобразования получаются матрицы коэффициентов Фурье. В этих матрицах отбрасываются высшие составляющие коэффициентов Фурье. Оставшиеся коэффициенты матриц затем сжимаются по методу Хаффмана Число этих коэффициентов определяется параметром качества изображения. Этот формат позволяет сжимать растровые изображения в 5–20 раз в зависимости от структуры картинки, и он используется в основном для хранения фотографий людей, природы и т.д. Он также стал основой для цифрового телевидения и является основой формата MJPEG. Следует помнить, что этот формат хранит картинки с частичной потерей информации, которую человеческий глаз почти не замечает. В нем не следуетхранить, например, графики функций, изображения с резким переходом яркости или цветности, так как вокруг линий будет появляться вуаль в виде отдельных точек, что становится уже заметным нашему глазу.
Приведем пример вывода в компонент Image1 картинки из файла с расширением *.jpg. В обработчике любого события можно записать:
Var AJpeg:TJpegImage; // Определяем указатель на картинку
Begin
AJpeg:=TJpegImage.Create; // Выделяем память под картинку
AJpeg.LoadFromFile(’C:\my\pic1.jpg’); // Читаем файл
Image1.Picture:=TPicture(AJpeg); // Отображаем картинку
AJpeg.Free; // Освобождаем память из–под картинки
End;
Рассмотрим теперь пример чтения картинки из базы данных. Пусть, например, в таблице ADOTable1 есть поле Pic, в котором хранятся картинки в формате JPEG. Тогда в обработчике какого–то события можно написать.
Var AJpeg:TJpegImage; // Определяем указатель на картинку
ABlobStream:TBlobStream; // Определяем указатель на поток байт
Begin
ABlobStream:=TBlobStream.Create(ADOTable1.FieldByName (‘Pic’)
as TBlobField, bmWrite); // Связываем поле таблицы с потоком
AJpeg:=TJpegImage.Create; // Выделяем память под картинку
AJpeg.LoadFromStream(ABlobStream); // Загружаем картинку
Imag1.Picture:=TPicture(AJpeg); // Отображаем картинку
AJpeg.Free. // Освобождаем память из–под картинки
End;
Отметим так же, что в Delphi можно работать и с картинками в формате GIF, в котором картинки хранятся в сжатом виде с использованием стандартного алгоритма LZW (Лемпела–Зива–Воотча). Этот алгоритм в процессе сжатия информации создает словарь слов и запоминает не сами слова, а их коды, которые занимают памяти существенно меньше, чем слова из словаря. Все современные архиваторы данных (ARJ, ZIP, RAR и др.) используют именно этот алгоритм сжатия информации, причем процесс сжатия идет без потери информации, как это наблюдается в картинках JPEG . Этот алгоритм может сжимать изображения в 2–5 раз. Формат GIF позволяет хранить сразу несколько картинок и чередовать их появление на экране, создавая подобие мультфильма. Этот формат картинок широко используется на страничках Интернета, в нем лучше всего хранить графики функций и контрастные изображения. Он официально не поддерживается в Delphi, но есть бесплатно рассылаемая библиотека компонентов RxLib, в которой есть поддержка такого формата картинок.
- Программирование в среде Delphi
- Программирование в среде Delphi
- 1. История развития вычислительной техники, системы счисления и единицы информации.................................................7
- 2. Структура персонального компьютера и операционные системы.........................................................................13
- 3. Основы алгоритмизации и работа в delphi..........................18
- 4. Базовые элементы delphi...................................................................26
- 5. Стандартные функции и подпрограммы................................30
- 6. Операторы delphi......................................................................................33
- 7. Операторы циклов....................................................................................35
- 18. Выделение памяти под объект и прародитель всех классов – tobject..........................................................................................84
- 19. Обработка исключительных ситуаций................................87
- 20. Основные классы и общие свойства компонентов...93
- 26. Технология com.....................................................................................129
- 1. История развития вычислительной техники, системы счисления и единицы информации
- 1.1. История развития вычислительной техники
- 1.2. Системы счисления
- 1.3. Единицы информации
- 2. Структура персонального компьютера и операционные системы
- 2.1. Структура персонального компьютера.
- 2.2. Операционные системы
- 3. Основы алгоритмизации и работа в delphi
- 3.1. Основы программирования
- 3.2. Программирование в среде Delphi
- 4. Базовые элементы delphi
- 4.1. Алфавит среды Delphi
- 4.2. Константы
- 4.3. Переменные
- 4.4. Основные типы переменных
- 4.5. Операции над переменными и константами
- 5. Стандартные функции и подпрограммы
- 5.1. Математические функции
- 5.2. Функции преобразования
- 5.3. Дополнительные системные подпрограммы и функции
- 6. Операторы delphi
- 6.1. Оператор присваивания
- 6.2. Оператор безусловной передачи управления
- 6.3. Условный оператор if
- 6.4. Оператор разветвления Case
- 6.5. Составной оператор
- 7. Операторы циклов
- 7.1. Оператор цикла For
- 7.2. Оператор цикла Repeat
- 7.3. Оператор цикла While
- 8. Работа с массивами
- 9. Работа со строками
- 9.1. Процедуры работы со строками
- 9.2. Функции работы со строками
- 10. Работа с записями
- 11. Процедуры и функции
- 12. Модуль unit
- 13. Работа со множествами
- 14. Работа с файлами
- 14.1. Текстовые файлы
- 14.2. Типированные файлы
- 14.3. Нетипированные файлы
- 15. Работа с файлами и каталогами
- 16. Динамические переменные и структуры данных
- 16.1. Динамические переменные
- 16.2. Работа со стеком
- 16.3. Работа со списками или очередями
- 16.4. Работа с деревьями
- 17. Основы объектно–ориентированного программирования
- 17.1. Объекты и классы
- 17.2. Области видимости класса
- 17.3. Свойства (Property) и инкапсуляция
- 17.4. Методы, наследование и полиморфизм
- 17.5. События (Events)
- 18. Выделение памяти под объект и прародитель всех классов – tobject
- 18.1. Выделение памяти под объект
- 18.2. Описание класса tObject
- 18.3. Операторы приведения типов классов
- 19. Обработка исключительных ситуаций
- 19.1. Два вида оператора Try
- 19.2. Программное создание исключительной ситуации
- 19.3. Основные исключительные ситуации
- 20. Основные классы и общие свойства компонентов
- 20.1. Класс tList
- 20.2. Класс tStrings
- 20.3. Общие свойства компонентов
- 21. Графические возможности delphi
- 21.1. Класс Tcanvas
- 21.2. Классы тGгарhic и тРicture
- 21.3. Классы tFont, tPen и tBrush
- 21.4. Работа с изображениями
- 22. Визуальные компоненты delphi
- 22.1. Компонент tBitBtn
- 22.2. Компоненты tDrawGrid и tStringGrid
- 22.3. Компонент tPageControl
- 22.4. Компонент tTimer
- 22.5. Компонент tGauge
- 22.6. Компонент tСolorGrid
- 23. Стандартные диалоговые окна и типовые диалоги
- 23.1. Стандартные диалоговые окна
- 23.2. Типовые диалоги
- 24. Форма, приложение и глобальные объекты
- 24.1. Форма и ее свойства
- 24.2. Объект Application
- 24.3. Глобальные объекты
- Объект ClipBoard
- Объект Screen
- Объект Printer
- 25. Межпрограммное взаимодействие
- 25.1. Обмен сообщениями
- 25.2. Динамический обмен данными
- 25.3. Совместное использование общей памяти
- 25.4. Каналы
- 25.5. Сокеты
- 26. Технология com
- 26.1. Интерфейс
- 27. Технология автоматизации
- 27.1. Основы ole Automation
- 27.2. Примеры использования серверов автоматизации
- 27.3. Компоненты ActiveX
- 28. Динамические библиотеки
- 28.1. Создание dll
- 28.2. Использование dll
- 28.3. Пример написания dll
- 29. Работа с базами данных
- 29.1. Основные определения
- 29.2. Взаимодействие приложения на Delphi с базами данных
- 29.3. Компоненты взаимодействия с базами данных
- If adoTable1.Locate(’fio,stag’,varArrayOf([’Иванов’,’10’]),[])Then …;
- 29.4. Работа с локальной базой данных
- 30. Основы языка sql
- 30.1. Составные части sql
- 30.2. Команда select
- 30.3. Пример использования запросов в Delphi
- 31. Создание собственных компонентов
- 32. Работа с реестром
- 33. Перспективы программирования в delphi
- Литература
- 220013, Минск, п.Бровки, 6