Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   С/С++, C#, Delphi, .NET, Asm (https://forum.antichat.xyz/forumdisplay.php?f=24)
-   -   Как преобразовать цветное изображение в черно-белое? (делфи/билдер) (https://forum.antichat.xyz/showthread.php?t=195375)

M_script_ 11.04.2010 14:06

Как преобразовать цветное изображение в черно-белое? (делфи/билдер)
 
Формат - bmp, хотя можно на примере jpeg, gif. Нужно преобразовать цветную картинку в черно-белую (не оттенки серого).

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

slesh 11.04.2010 14:48

самый преметивный сопсоб: простым сравнение средней яркости. Тупой способ, но более менее норм выглядит и простой. Вот не оптимизированный вариант.
Код:

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;


slesh 11.04.2010 14:54

Число 128 - это порог сравнения. Его можно менять чтобы подогнать под нужный вид.
Часто 80 идет очень хороош

M_script_ 11.04.2010 17:18

slesh, спасибо за пример.
[offtop]
Не подскажешь, как правильно уничтожить объект TImage в билдере, чтобы освободить всю память?
[/offtop]

slesh 11.04.2010 21:23

*****.Destroy();


Время: 02:03