Как в Delphi сохранить gif картинку

Вплоть до версии 2010 Delphi не имела стандартных средств для работы с gif-форматом. Если же сохранять в bmp, то, когда нужно сделать большое количество картинок (например, построить много графиков), быстро обнаруживается, что жесткий диск и тем более флешки не бесконечны. К счастью уже много лет существует сторонняя разработка — класс TGIFImage.

Работа с растровыми картинками в Delphi осуществляется с помощью класса TBitmap. В целом процесс получения gif картинки выглядит так:

1) Получаем картинку в виде объекта класса TBitmap.
2) Создаем объект класса TGifImage, передаем в него TBitmap и сохраняем.

Итак, по-порядку.

Как получить объект TBitmap

Если картинка находится в компоненте Image

Тогда все просто, ваш TBitmap это Image1.Picture.Bitmap. Вместо Image1, само собой, стоит имя вашего Image’а.

Если картинка нарисована на Canvas’е формы или чего-нибудь еще

Класс TBitmap также имеет свойство Canvas. Нужно создать объект этого класса и скопировать нужный Canvas в его Canvas методом CopyRect. Например, для формы:

procedure FormToBitmap(Form: TForm; var Bmp: TBitmap);
var
  R: TRect;
begin
  //Задаем прямоугольную область, которая будет сохранена
  R.Left := 0;
  R.Right := Form.ClientWidth - 1;
  R.Top := 0;
  R.Bottom := Form.ClientHeight - 1;
  //Создаем Bitmap
  Bmp := TBitmap.Create;
  Bmp.Width := Form.ClientWidth;
  Bmp.Height := Form.ClientHeight;
  //Копируем картинку из формы в Bitmap
  Bmp.Canvas.CopyRect(R, Form.Canvas, R);
end;

Если нужно сохранить график из Chart’а

У Chart’а есть Canvas, но он не совместим со стандартным. Для преодоления этой трудности мне известно два метода:

1) Сохраняем картинку из Chart’а в bmp-формате, затем грузим ее в Bitmap, а файл стираем.

procedure ChartToBitmap1(Chart: TChart; var Bmp: TBitmap);
begin
  Chart.SaveToBitmapFile('temp.bmp');
  Bmp := TBitmap.Create;
  Bmp.LoadFromFile('temp.bmp');
  DeleteFile('temp.bmp');
end;

2) Перекидываем картинку через буфер

//Должен быть подключен модуль Clipbrd
procedure ChartToBitmap2(Chart: TChart; var Bmp: TBitmap);
begin
  Chart.CopyToClipboardBitmap;
  Bmp := TBitmap.Create;
  Bmp.Assign(Clipboard);
end;

Как сохранить TBitmap в gif-формате

Для этого делайте следующее:

1) Скачивайте модуль для работы с gif-форматом

http://www.tolderlund.eu/delphi/gifimaged2010b.zip (200Кб)

2) Добавляйте файл GIFImage.pas в ваш проект и подключайте модуль GIFImage в разделе uses.

3) Дальше действуем так:

procedure SaveBitmapToGif(Bmp: TBitmap; FileName: string);
var
  Gif: TGIFImage;
begin
  //Создаем объект TGIFImage
  Gif := TGIFImage.Create;
  //Передаем туда картинку из Bitmap'а
  Gif.Assign(Bmp);
  //Удаляем лишние цвета из палитры
  Gif.OptimizeColorMap;
  //* Ура! *//
  //Сохраняем картинку в gif формате
  Gif.SaveToFile(FileName);
  Gif.Free;
end;

Если в вашей картинке используется меньше 256 цветов, то вызов

 Gif.OptimizeColorMap;

позволяем уменьшает размер палитры до реального количества цветов. Это позволяет сэкономить несколько сотен байт. Вы, возможно, привыкли к картинкам по мегабайту, где такая экономия кажется микроскопической? Отвыкайте. Теперь ваши графики будут такими, что это станет заметной экономией.

PS. За последними версиями модуля для работы с Gif заходите на сайт разработчика: http://www.tolderlund.eu/delphi/

Добавить комментарий