Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Звук, графика и видео > Чёрно-белые изображения


Автор: Sergey89 25.10.2004, 17:55
Как в delphi из цветного сделать чёрно белое изображение?

Автор: Kesh 25.10.2004, 20:51
Код

//Решение в лоб...
var
 i,j: integer;
 Color: TColor;
 B: TBitmap;
 Mid: Byte;
 Res: integer;
begin
// Сначала перевод в градации серого как среднее арифметическое цветовых компонент
 for i := 0 to imgMain.Picture.Bitmap.Height-1 do
     for j := 0 to imgMain.Picture.Bitmap.Width-1 do
       begin
         Color := ColorToRGB(imgMain.Picture.Bitmap.Canvas.Pixels[j,i]);
         Mid := Round((GetRValue(Color)+GetGValue(Color)+GetBValue(Color))/3);
         imgMain.Picture.Bitmap.Canvas.Pixels[j,i] := RGB(Mid,Mid,Mid);
       end;
// А потом из градаций серого в ч.б...
 for i := 0 to imgMain.Picture.Bitmap.Height-1 do
     for j := 0 to imgMain.Picture.Bitmap.Width-1 do
       begin
         Color := ColorToRGB(imgMain.Picture.Bitmap.Canvas.Pixels[j,i]);
         if GetRValue(Color)<128 then Mid := 0 else Mid := 255;
         imgMain.Picture.Bitmap.Canvas.Pixels[j,i] := RGB(Mid,Mid,Mid);
       end;
end;

Автор: Illusion Dolphin 25.10.2004, 21:24
А теперь более правильное решение, в котором правильно преобразуется цвет и немного быстрее:

Код


type

type
 TRGB=record
 b,g,r : byte;
  end;
 Type
   ARGB=array [0..1] of TRGB;
   PARGB=^ARGB;

procedure BlackWhite(image : tbitmap);
var
 i, j, c : integer;
 p : PARGB;
begin
image.PixelFormat:=pf24bit;
for i:=0 to image.Height-1 do
begin
 p:=image.ScanLine[i];
 for j:=0 to image.Width-1 do
 begin
  c:=round(0.3*p[j].r+0.59*p[j].g+0.11*p[j].b);
  if c>=128 then c:=255 else c:=0; //эту строку надо убрать чтобы получить градации серого
  p[j].r:=c;
  p[j].g:=c;
  p[j].b:=c;
 end;
end;
end;


Автор: Kesh 25.10.2004, 21:28
Illusion Dolphin А откуда берутся эти коэффициенты?.. 0.3 0.59 и 0.11

Автор: Illusion Dolphin 25.10.2004, 23:14
Цитата

А откуда берутся эти коэффициенты

Очень просто: если взять три лампочки разных цветов (красный, синий и зелёный) и одинаковой мощности светимости, то человеческий глаз будет думать, что все они светятся с разной интенсивностью, т.к. чувствительность глаза зависит от длины волны света. Отсюда получается, что при переводе в чёрно-белый (т.е. по сути в интенсивность) ДЛЯ ЧЕЛОВЕКА нужно брать эти коэффициенты и т.к. все тут пока ещё люди, то пользуются именно этим разложением. Т.е. это вопрос по сути относится к физике+биологии\физиологии человека

Автор: cardinal 19.11.2004, 00:58
Цитата(Sergey89 @ 25.10.2004, 16:55)
Как в delphi из цветного сделать чёрно белое изображение?

Если с "сохранением серых тонов", то читайте тут:
http://www.compuphase.com/riemer.htm

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)