![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Цветное изображение в чёрно-белое
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.