Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Цветное изображение в чёрно-белое


Japan ©   (2003-12-17 19:29:00) 

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


Ангел.   (2003-12-21 17:48:00) [1]

Как вариант почитай в хелпе по дельфи про TBitmap А конкретно пиксельформат и монохороме :)


bolegator   (2003-12-19 12:31:00) [2]

Только у одних color-> gray
а у других color->bw


Asteroid   (2003-12-18 23:43:00) [3]

И у всех свои формулы :)


bolegator   (2003-12-18 19:30:00) [4]

const bitmask:array [0..7] of byte=($80, $40, $20, $10, $08, $04, $02, $01);


bolegator   (2003-12-18 19:28:00) [5]

procedure ConvertToBW(bitmap:TBitmap; Threshold:integer);
var
x,y,v,b,mR,mG,mB:integer;
  newbmp:TBitmap;
  p1:pRGB;
  p2:pbyte;
begin
if Bitmap.Pixelformat<>pf24bit then exit;
  newbmp:=TBitmap.Create;
  newbmp.Width:=bitmap.Width;
  newbmp.Height:=bitmap.Height;
  newbmp.PixelFormat:=pf1bit;
  for y:=0 to bitmap.height-1 do begin
   p1:=bitmap.ScanLine[y];
     p2:=newbmp.ScanLine[y];
 for x:=0 to bitmap.width-1 do begin
      b:=x mod 8;
      with p1^ do
       v:=(r*21 + g*71 + b*7) div 100;
        if v>=Threshold then
   p2^:=p2^ or bitmask[b]
        else
           p2^:=p2^ and (not bitmask[b]);
        inc(p1);
        if b=7 then
         inc(p2);
   end;
  end;
  CopyBitmap(newbmp,bitmap);
  newbmp.free;
end;

Threshold=150..220


Sergio Bassy   (2003-12-18 13:24:00) [6]

Если тебя интересуют градации серого, то можешь юзать одну из таких формул:
1. Y=0.36*R + 0.53*G + 0.11*B
R=G=B=Y

2. Стандаpт CCIR 601-1 (как в стандаpтной VGA-ой функции):
Gray=(299*Red+587*Green+114*Blue)/1000.

3. Стандаpт CCIR 709:
Gray=(213*Red+715*Green+72*Blue)/1000.

4. Стандаpт ITU:
Gray=(222*Red+707*Green+71*Blue)/1000.

Если же тебе надо получить двухцветное изображение, то следует применять алгоритмы дизеринга, например Floyd-Steinberg Dithering. Простое отсечение порога(без дизеринга) Gray=(Gray>127)?255:0 не является удовлетворительным решением.


Sergio Bassy   (2003-12-18 13:22:00) [7]

формула преобразования в оттенки серого:
c=0.3r+0.59g+0.11b


Sergio Bassy   (2003-12-18 13:19:00) [8]

>Если так для каждого пикселя делать, то это слишком долго >получается, если картинка большая.
иначе - только пользоваться доп. библиотеками, что тебе, как новичку, затруднительно. тебе проще- попиксельно.
>Есть ли более быстрый способ?
более быстрый (по сравнению с работой через канву) - это используй ScanLines.


Awod   (2003-12-18 13:05:00) [9]

Не помню как это делается, но у меня есть код программы, который когда то писался для компутерной графики в институте, который переводит картинку в чёрнобелое изображение. Если нужно, могу выслать


REP   (2003-12-18 12:30:00) [10]

>>Есть пиксел RGB. Самый простой способ - сложить R,G,B, потом разделить на 3 (получив, допустим, D) и записать пиксел DDD.

Так нельзя. У каждого цвета своя интенсивность. Не помню сейчас формулу. Там у каждого цвета свои коэффициенты.


Asteroid   (2003-12-18 03:24:00) [11]

Черно-белое или с оттенками серого?
А для каждого пикселя так или иначе придется.


Japan   (2003-12-18 00:42:00) [12]

Если так для каждого пикселя делать, то это слишком долго получается, если картинка большая.
Есть ли более быстрый способ?


miek   (2003-12-17 22:24:00) [13]

Есть пиксел RGB. Самый простой способ - сложить R,G,B, потом разделить на 3 (получив, допустим, D) и записать пиксел DDD.


Наверх

Титульная страница Поиск, карта сайта Написать письмо