Как преобразовать цветное изображение в черно-белое? (делфи/билдер)

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by Meecript_, 11 Apr 2010.

  1. Meecript_

    Meecript_ Banned

    Joined:
    29 Oct 2008
    Messages:
    194
    Likes Received:
    62
    Reputations:
    32
    Формат - bmp, хотя можно на примере jpeg, gif. Нужно преобразовать цветную картинку в черно-белую (не оттенки серого).

    P.S.: Monochrome = true и PixelFormat = pf1bit не подходят.
     
  2. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    самый преметивный сопсоб: простым сравнение средней яркости. Тупой способ, но более менее норм выглядит и простой. Вот не оптимизированный вариант.
    Code:
    procedure TForm1.Button1Click(Sender: TObject);
    var
     x, y : integer;
     r, g, b : byte;
     c : dword;
    begin
      Image1.Picture.LoadFromFile('d:\1.bmp');
    
      for y := 0 to Image1.Height-1 do
      begin
        for x := 0 to Image1.Width-1 do
        begin
          c := Image1.Canvas.Pixels[x,y];
          r := GetRValue(c);
          g := GetGValue(c);
          b := GetBValue(c);
    
          if (r + g + b) div 3 > 128 then
          begin
            Image1.Canvas.Pixels[x,y] := clWhite;
          end
          else
          begin
            Image1.Canvas.Pixels[x,y] := clBlack;
          end;
        end;
      end;
    end;
    
     
  3. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    Число 128 - это порог сравнения. Его можно менять чтобы подогнать под нужный вид.
    Часто 80 идет очень хороош
     
  4. Meecript_

    Meecript_ Banned

    Joined:
    29 Oct 2008
    Messages:
    194
    Likes Received:
    62
    Reputations:
    32
    slesh, спасибо за пример.
    [offtop]
    Не подскажешь, как правильно уничтожить объект TImage в билдере, чтобы освободить всю память?
    [/offtop]
     
  5. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    *****.Destroy();