Средство разработки 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. |
Часть исходного кода программы выглядит следующим образом: |
Windows, сообщения, SysUtils, классы, графика, элементы управления, формы, диалоги, StdCtrls, Zlib; |
процедура Button1Click (Отправитель: TObject); |
процедура Button2Click (Отправитель: TObject); |
1. Захват полноэкранного изображения |
процедура GetScreen (вар Bmp: TBitmap); |
MyCanvas := TCanvas.Create; |
MyRect:=Rect(0, 0,Screen.Width, Screen.Height); |
//Изображение имеет 24-битный реальный цвет, который также можно настроить в соответствии с реальными потребностями. |
Bmp.PixelFormat:= pf24bit; |
Bmp.Width := MyRect.Right; |
Bmp.Height := MyRect.Bottom; |
//Захват изображения всего экрана |
Bmp.Canvas.CopyRect(MyRect, MyCanvas, MyRect); |
процедура CompressBitmap (var CompressedStream: TMemoryStream; const CompressionLevel: TCompressionLevel); |
Исходный поток: TCompressionStream; |
DestStream: TMemoryStream; |
//Получаем исходный размер потока изображений |
Count := CompressedStream.Size; |
DestStream := TMemoryStream.Create; |
SourceStream:=TCompressionStream.Create |
(Уровень сжатия, DestStream); |
//SourceStream хранит исходный поток изображений |
CompressedStream.SaveToStream(SourceStream); |
//Сжимаем исходный поток изображений, и сжатый поток изображений сохраняется в DestStream. |
//Записываем размер исходного изображения |
CompressedStream.WriteBuffer(Count, SizeOf |
//Записываем сжатый поток изображений |
CompressedStream.CopyFrom(DestStream, 0); |
3. Восстановление сжатых изображений |
процедура UnCompressBitmap (const CompressedStream: TFileStream; var Bmp: TBitmap); |
Исходный поток: TDecompressionStream; |
DestStream: TMemoryStream; |
//Читаем размер исходного изображения из потока сжатых изображений |
CompressedStream.ReadBuffer(Count, SizeOf(Count)); |
//Выделяем блоки памяти для чтения исходного потока изображений в соответствии с размером изображения |
GetMem(Буфер, Количество); |
DestStream := TMemoryStream.Create; |
SourceStream:= TDecompressionStream.Create(CompressedStream); |
//Распаковываем сжатый поток изображений и сохраняем его в блоке буферной памяти |
SourceStream.ReadBuffer(Буфер^, Количество); |
//Сохраняем исходный поток изображения в поток DestStream |
DestStream.WriteBuffer(Буфер^, Количество); |
DestStream.Position := 0;//Сбросить указатель потока |
//Загружаем исходный поток изображений из потока DestStream |
Bmp.LoadFromStream(DestStream); |
4. Событие OnClick кнопки сжатия |
процедура TForm1.Button1Click(Отправитель: TObject); |
Сжатый поток: TMemoryStream; |
CompressedStream := TMemoryStream.Create; |
//Захват всего текущего экрана и сохранение изображения в объект Bmp GetScreen(Bmp); |
//Сохраняем изображение в объекте Bmp в поток памяти |
Bmp.SaveToStream(СжатыйПоток); |
//Сжимаем исходный поток изображений в соответствии со степенью сжатия по умолчанию |
CompressBitmap(CompressedStream, clDefault); |
//Сохраняем сжатый поток изображений в файл пользовательского формата |
CompressedStream.SaveToFile(' C:cj.dat'); |
5. Событие OnClick кнопки "Разархивировать" |
процедура TForm1.Button2Click(Отправитель: TObject); |
СжатыйПоток: TFileStream; |
//Открываем файл пользовательского сжатого формата в режиме только для чтения файлового потока |
CompressedStream:= TFileStream.Create(' C:cj.dat', fmOpenRead); |
//Распаковываем сжатый поток изображений |
UnCompressBitmap (CompressedStream, Bmp); |
//Восстанавливаем исходный поток изображений в указанный BMP-файл |
Bmp.SaveToFile('C:cj.bmp'); |
Кроме того, объект TCompressionStream также предоставляет свойство CompressionRate, которое используется для описания степени сжатия после сжатия исходных данных. Событие OnProgress запускается во время процессов сжатия и распаковки. Разработчики могут записать это событие для отображения кода выполнения. . |
Приведенный выше код проходит отладку и выполняется в Delphi 5.0. |