Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Попиксельное сравнение картинок

Delphi , Графика и Игры , Bitmap

Попиксельное сравнение картинок

Оформил: DeeCo
Автор: http://www.swissdelphicenter.ch

procedure TForm1.Button1Click(Sender: TObject);
 var
   b1, b2: TBitmap;
   c1, c2: PByte;
   x, y, i,
   different: Integer; // Counter for different pixels 
begin
   b1 := Image1.Picture.Bitmap;
   b2 := Image2.Picture.Bitmap;
   Assert(b1.PixelFormat = b2.PixelFormat); // they have to be equal 
  different := 0;
   for y := 0 to b1.Height - 1 do
   begin
     c1 := b1.Scanline[y];
     c2 := b2.Scanline[y];
     for x := 0 to b1.Width - 1 do
       for i := 0 to BytesPerPixel - 1 do // 1, to 4, dep. on pixelformat 
      begin
         Inc(different, Integer(c1^ <> c2^));
         Inc(c1);
         Inc(c2);
       end;
   end;
 end;

Переведенный текст:

Код на Delphi - процедура, сравнивающая два изображения и подсчитывающая количество различных пикселей между ними. Сравнение производится пиксель за пикселем, учитывая глубину цвета каждого пикселя (1, 4 или 8 бит в зависимости от формата изображения).

Вот шаг за шагом, что код делает:

  1. Он объявляет несколько переменных:
    • b1 и b2: объекты TBitmap, представляющие два изображения.
    • c1 и c2: указатели PByte, указывающие на строки (строки) битмапов.
    • x, y, i и different: целочисленные переменные для целей и подсчета.
  2. Он присваивает изображения из контролов Image1 и Image2 к b1 и b2, соответственно, используя свойство Bitmap.
  3. Он утверждает, что оба битмапа имеют тот же формат пикселей (например, 24-бит RGB или 32-бит RGBA).
  4. Он инициализирует счетчик для различных пикселей (different) в ноль.
  5. Внешний цикл проходит по каждой строке (y) изображений, а внутренний цикл проходит по каждому пикселю (x) в этой строке.
  6. Для каждого пикселя он проходит через байты, представляющие пиксель (до BytesPerPixel количества байт). В Delphi BytesPerPixel - константа, определенная в типе TBitmap, которая зависит от формата пикселей (1, 2 или 4).
  7. Внутри этого внутреннего цикла он сравнивает значения каждого байта между изображениями с помощью оператора < > и увеличивает счетчик different соответственно.
  8. Наконец, он увеличивает указатели на следующий пиксель в обеих строках.

Заявление Assert обеспечивает, что оба битмапа имеют тот же формат пикселей перед продолжением сравнения. Это необходимо потому, что некоторые форматы изображений могут не быть совместимы для сравнения (например, разные глубины цвета).

Обратите внимание: код предполагает, что изображения хранятся в приложении Delphi и доступны через контролы Image1 и Image2. Если вы используете этот код в другом окружении, вам нужно адаптировать его соответствующим образом.

Альтернативное решение: Вместо ручного прохода по каждому пикселю и байту можно использовать свойство TBitmap.ScanLine для получения указателя на строку (строку) и затем использовать тип PByte для прохода по пикселям. Этот подход может быть более эффективным для больших изображений.

var
  b1, b2: TBitmap;
begin
   // ...
  for y := 0 to b1.Height - 1 do
  begin
    c1 := b1.ScanLine[y];
    c2 := b2.ScanLine[y];
    for x := 0 to b1.Width - 1 do
    begin
      Inc(different, Integer(c1^ <> c2^));
      Inc(PByte(c1)^);
      Inc(PByte(c2)^);
    end;
  end;
end.

В этом коде используется тип PByte для прохода по пикселям и сравнения их значений. Функция Inc используется для увеличения указателя на следующий пиксель в обеих строках.

В статье описывается процедура TForm1.Button1Click, которая сравнивает два изображения в пиксельном масштабе и находит количество отличающихся пикселей.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Bitmap ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-06-15 22:06:53/0.0036628246307373/0