Средство разработки 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. |