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;
Для кожного фільтру можна вивести список властивостей, щоб подивитись, який функціонал він підтримує.
Останні коментарі