Массовое преобразование картинок.

Сегодня встала такая задача — отредактировать картинки. Дописать текст в верхний левый угол, проставить некие копирайты на каждую картинку.

Всё бы ничего, если бы не количество изображений — более 400. Брррр, вручную конечно можно, но долго и неинтересно. Можно поискать готовое решение, но небезопасно и тоже неинтересно.
Итак, будем писать на дельфи. Оформлять как готовую программу не буду, так как писал только для добавления копирайта, релиз делать не собирался.
Ну что, мне друг прислал 401 картинку типа Windows Bitmap (BMP), мне нужно, как я уже сказал, поместить текст на каждую, отредактировать все сразу.

1. Основа программы.

Создаём новый проект, убираем форму, Project — View source, кодить будем здесь. Использовать будем следующие модули: windows, sysutils, graphics. Можно и без SysUtils, тогда нам придётся использовать свой вариант функции IntToStr (Обходимся без SysUtils. Строка <-> число), а для подручной программы это делать долго. Что у нас на данном этапе:

program Project1;

uses
  windows,
  graphics,
  sysutils;

begin

end.

2. Переменные.

Объявим следующее:
b: TBitmap — сюда будем загружать очередную картинку,
i: integer — это счётчик, он будет меняться от нуля до 401,
s: string — сюда записываем имя файла

3. Штампуем)

Так вот, нам нужно сначала создать объект класса TBitmap, а в конце его уничтожить. А посередине сделаем простой цикл. Если писать программу для масс, для тех, кто хочет дорисовать каждую картинку в определенной папке, независимо от имени, надо использовать FindFirst и FindNext, напишу как-нибудь про это вкратце, а сейчас ограничимся простым циклом for.
Для загрузки и сохранения картинки используем LoadFromFile и SaveToFile.
Вывода текста на TCanvas: TCanvas.TextOut(x, y: integer; text: string). С этой процедурой всё понятно.
Так-то оно так, но при таком раскладе текст нарисуется с непрозрачным фоном, это не очень красиво. Используем api функцию SetBKMode.
Остается добавить, что у объекта типа TCanvas есть свойство Font, это у нас шрифт. Ну и для красивого кода нам понадобится оператор with.

3. Код программы.

program Project1;

uses
  windows,
  graphics,
  sysutils;

var
  b: TBitmap;
  i: integer;
  s: string;

begin
  b:=TBitmap.Create;
  for i:=1 to 401 do begin
    s:='c:\w\photo'+inttostr(i)+'.bmp';
    with b do begin
      LoadFromFile(s);
      SetBKMode(Canvas.Handle, windows.TRANSPARENT);
      Canvas.Font.Color:=clGreen;
      Canvas.Font.Style:=[fsBold];
      Canvas.TextOut(10, 10, 'http://parsers.info');
      SaveToFile(s);
    end;
  end;
  b.Free;
end.

c:\w\ это путь к моим файлам, ты уже понял.
И еще небольшая оговорка — константа TRANSPARENT, мы её используем в функции SetBKMode. Догадался, зачем мы обращаемся к ней, как к windows.TRANSPARENT? Мы находимся внутри with, то есть всё написанное может быть связано с объектом b, а у него есть свойство Transparent! Вот мы и указываем, что нам нужно не оно, хоть и приоритет в его пользу.

4. Итог.

Вот мы и набросали программу, которая добавит во все картинки надпись. Проблема решена. А надо что-то другое — отредактировать пару строк и готово.

Как видим, не стоит особо париться и проставлять надпись на каждую картинку по отдельности — нам нужно дельфи и немного рук. А в освободившееся время можно и настольными играми заняться, к примеру, бакуган :)

(c) crystalbit, http://parsers.info