Обработка сжатия данных Delphi(1)
Средство разработки RAD Delphi 5.0, выпущенное компанией Borland, является основным средством разработки на платформе Windows. Его среда визуальной разработки и мощные функции объектно-ориентированного программирования привлекли бесчисленное количество разработчиков. Однако некоторым программистам часто приходится сталкиваться со сжатием больших объемов данных в ходе фактического процесса разработки, и им приходится находить эффективные алгоритмы сжатия или искать сторонние элементы управления в Интернете для достижения сжатия. Разве сам Delphi не предоставляет эту функцию? Фактически, программисты Delphi уже учли это. Они предоставили два юнит-файла, Zlib.pas и Zlibconst.pas, для решения проблемы сжатия данных и достижения высокой степени сжатия данных. Эти два файла сохраняются в каталоге InfoExtras lib на установочном компакт-диске Delphi 5.0. Кроме того, файл Obj, на который ссылается модуль Zlib.pas, также сохраняется в каталоге InfoExtras libObj. В следующей статье в качестве примера используется сжатие копии экрана, чтобы показать, как использовать эту функцию.
Идеи решения
Сначала используйте копию экрана, чтобы захватить текущее изображение всего экрана, а затем сохраните его в памяти в формате файла BMP. При сжатии используйте объект TComPRessionStream, чтобы сжать исходное изображение и сохранить его в пользовательском формате файла; при распаковке используйте объект TDecompressionStream, чтобы распаковать сжатое изображение и восстановить его в файл изображения формата BMP.
Конкретная реализация
Создайте новый файл проекта, укажите ссылку на Zlib.pas в интерфейсной части основного модуля, разместите на главной форме две кнопки Button1 и Button2 и напишите соответствующий код вызова процедуры в их событии OnClick.
Часть исходного кода программы выглядит следующим образом:
блок Unit1;
интерфейс
использует
Windows, сообщения, SysUtils, классы, графика, элементы управления, формы, диалоги, StdCtrls, Zlib;
тип
ТФорм1 = класс (ТФорма)
Кнопка1: Кнопка T;
Кнопка2: Кнопка T;
процедура Button1Click (Отправитель: TObject);
процедура Button2Click (Отправитель: TObject);
частный
{Частные заявления}
общественный
{Публичные заявления}
конец;
вар
Форма1: ТФорм1;
выполнение
{$R*.DFM}
1. Захват полноэкранного изображения
процедура GetScreen (вар Bmp: TBitmap);
вар
постоянный ток: HDC;
МойКанвас: ТКанвас;
МойРект: TRect;
начинать
Dc := GetWindowDC(0);
MyCanvas := TCanvas.Create;
пытаться
MyCanvas.Handle := Dc;
MyRect:=Rect(0, 0,Screen.Width, Screen.Height);
file://Изображение имеет 24-битный реальный цвет и может быть настроено в соответствии с реальными потребностями.
Bmp.PixelFormat:= pf24bit;
Bmp.Width := MyRect.Right;
Bmp.Height := MyRect.Bottom;
file://захватить изображение всего экрана
Bmp.Canvas.CopyRect(MyRect, MyCanvas, MyRect);
окончательно
MyCanvas.Handle:= 0;
МойКанвас.Бесплатно;
ReleaseDC (0, DC);
конец;
конец;
2. Сжатие изображений
процедура CompressBitmap (var CompressedStream: TMemoryStream; const CompressionLevel: TCompressionLevel);
вар
Исходный поток: TCompressionStream;
DestStream: TMemoryStream;
Счет: целое число;
Начинать
file://получает исходный размер потока изображений
Count := CompressedStream.Size;
DestStream := TMemoryStream.Create;
SourceStream:=TCompressionStream.Create
(Уровень сжатия, DestStream);
Пытаться
Исходный поток изображений хранится в файле://SourceStream.
CompressedStream.SaveToStream(SourceStream);
file://сжимает исходный поток изображений, а сжатый поток изображений сохраняется в DestStream.
SourceStream.Free;
СжатыйПоток.Очистить;
file:// записывает размеры исходного изображения
CompressedStream.WriteBuffer(Count, SizeOf
(Считать));
file://Записать поток сжатых изображений
CompressedStream.CopyFrom(DestStream, 0);
окончательно
ДестСтрим.Бесплатно;
конец;
конец;
3. Восстановление сжатых изображений
процедура UnCompressBitmap (const CompressedStream: TFileStream; var Bmp: TBitmap);
вар
Исходный поток: TDecompressionStream;
DestStream: TMemoryStream;