Головна > Delphi, Програмування > WIA в Delphi. Частина 4. Обробка та конвертація зображень

WIA в Delphi. Частина 4. Обробка та конвертація зображень

WIA дозволяє не тільки отримувати зображення із пристроїв, а й перетворювати їх із одного формату в інший, обрізати, повертати, змінювати масштаб, працювати із EXIF. Весь цей функціонал реалізовує об’єкт

ImageProcess

Керування списком фільтрів, кожен з яких виконує певну обробку зображення. Необхідні фільтри потрібно заздалегідь включити до списку, налаштувати необхідні параметри, після чого виконати обробку зображення (об’єкт ImageFile). Загалом принципи роботи із ImageProcess ті ж самі, що із іншими об’єктами WIA – через списки властивостей.

FilterInfos

Колекція всіх доступних фільтрів.

Filters

Колекція фільтрів, що використовуються.

Apply

Застосування фільтрів з колекції Filters до об’єкта ImageFile.

Колекція Filters містить такі методи і властивості:

Add

Додає або вставляє новий фільтр вказаного у колекцію фільтрів.

Remove

Видаляє фільтр.

Count

Кількість елементів в колекції.

Item

Елемент колекції.

 

Приклад конвертації формату файла:


const
  wiaFilterConvert = '{42A6E907-1D2F-4b38-AC50-31ADBE2AB3C2}';
var
  lImageProcess: IImageProcess;
  lImage: IImageFile;
  lProperty: IProperty;
  PropName: string;
  PropValue: OleVariant;
  fii: Integer;
  fii_v: OleVariant;
...
// Об'єкт керування фільтрами
lImageProcess := CreateComObject(CLASS_ImageProcess) as IImageProcess;
// Зображення
lImage := CreateComObject(CLASS_ImageFile) as IImageFile;
lImage.LoadFile(ExtractFilePath(Application.ExeName) + 'image.bmp');
if lImageProcess <> nil then
begin
  // Додаємо фільтр конвертації в інший формат
  lImageProcess.Filters.Add(wiaFilterConvert, 0);
  // Список параметрів фільтру
  for fii := 1 to lImageProcess.Filters.Item[1].Properties.Count do
  begin
    fii_v := fii;
	// Читаємо параметр фільтру
    lProperty := lImageProcess.Filters.Item[1].Properties.Item[fii_v];
    if lProperty <> nil then
    begin
      PropName := lProperty.Name;
	  // Встановлюємо формат PNG
      if SameText(PropName, 'FormatID') then
      begin
        PropValue := wiaFormatPNG;
        lProperty.Set_Value(PropValue);
      end;
    end;
  end;
  // Конвертація
  lImage := lImageProcess.Apply(lImage);
  // Збереження в файл
  lImage.SaveFile(ExtractFilePath(Application.ExeName) + 'image.png');
end;

 

Розглянемо ще кілька прикладів використання ImageProcess.

Зменшення bitmap зображення вдвічі:


const
  wiaFilterScale = '{4EBB0166-C18B-4065-9332-109015741711}';
var
  lImageProcess: IImageProcess;
  lImage: IImageFile;
  lProperty: IProperty;
  PropName: string;
  PropValue: OleVariant;
  fii: Integer;
  fii_v: OleVariant;
...
// Об'єкт керування фільтрами
lImageProcess := CreateComObject(CLASS_ImageProcess) as IImageProcess;
// Зображення
lImage := CreateComObject(CLASS_ImageFile) as IImageFile;
lImage.LoadFile(ExtractFilePath(Application.ExeName) + 'image.bmp');
if lImageProcess <> nil then
begin
  // Додаємо фільтр зміни розміру
  lImageProcess.Filters.Add(wiaFilterScale, 0);
  // Список параметрів фільтру
  for fii := 1 to lImageProcess.Filters.Item[1].Properties.Count do
  begin
    fii_v := fii;
	// Читаємо параметр фільтру
    lProperty := lImageProcess.Filters.Item[1].Properties.Item[fii_v];
    if lProperty <> nil then
    begin
      PropName := lProperty.Name;
      // Встановлюємо нову ширину
      if SameText(PropName, 'MaximumWidth') then
      begin
        PropValue := Round(lImage.Width div 2);
        lProperty.Set_Value(PropValue);
      end;
      // Встановлюємо нову висоту
      if SameText(PropName, 'MaximumHeight') then
      begin
        PropValue := Round(lImage.Height div 2);
        lProperty.Set_Value(PropValue);
      end;
      // Вказуємо необхідність зберегти співвідношення сторін
      if SameText(PropName, 'PreserveAspectRatio') then
      begin
        PropValue := True;
        lProperty.Set_Value(PropValue);
      end;
    end;
  end;
  // Конвертація
  lImage := lImageProcess.Apply(lImage);
  // Збереження в файл
  lImage.SaveFile(ExtractFilePath(Application.ExeName) + 'image2.bmp');
end;

Обертання JPEG зображення на 90 градусів:


const
  wiaFilterRotateFlip = '{FB912B7A-C57F-479C-9209-4895C1513F2D}';
var
  lImageProcess: IImageProcess;
  lImage: IImageFile;
  lProperty: IProperty;
  PropName: string;
  PropValue: OleVariant;
  fii: Integer;
  fii_v: OleVariant;
...
// Об'єкт керування фільтрами
lImageProcess := CreateComObject(CLASS_ImageProcess) as IImageProcess;
// Зображення
lImage := CreateComObject(CLASS_ImageFile) as IImageFile;
lImage.LoadFile(ExtractFilePath(Application.ExeName) + 'image.jpeg');
if lImageProcess <> nil then
begin
  // Додаємо фільтр зміни розміру
  lImageProcess.Filters.Add(wiaFilterRotateFlip, 0);
  // Список параметрів фільтру
  for fii := 1 to lImageProcess.Filters.Item[1].Properties.Count do
  begin
    fii_v := fii;
	// Читаємо параметр фільтру
    lProperty := lImageProcess.Filters.Item[1].Properties.Item[fii_v];
    if lProperty <> nil then
    begin
      PropName := lProperty.Name;
      // Встановлюємо кут (можливі значення: 0, 90, 180, 270)
      if SameText(PropName, 'RotationAngle') then
      begin
        PropValue := 90;
        lProperty.Set_Value(PropValue);
      end;
    end;
  end;
  // Конвертація
  lImage := lImageProcess.Apply(lImage);
  // Збереження в файл
  lImage.SaveFile(ExtractFilePath(Application.ExeName) + 'image2.jpeg');
end;

Для віддзеркалення зображення потрібно змінити властивість FlipHorizontal або FlipVertical:


if SameText(PropName, 'FlipVertical') then
begin
  PropValue := True;
  lProperty.Set_Value(PropValue);
end;

Для кожного фільтру можна вивести список властивостей, щоб подивитись, який функціонал він підтримує.

Delphi, Програмування , , , ,

  1. Ще немає коментарів.
  1. Немає ще трекбеків.
Вам потрібно увійти, для коментування