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

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

Монохромность


ИМХО ©   (2004-03-03 05:56:00) 

Как сделать true color jpeg-картинку монохромной? Может есть какой-то безупречный алгоритм? Делал так: преобразовывал в tbitmap, ставил свойство Monochrome в True, но получалась такая ерунда, что смотреть было страшно.


MBo   (2004-03-04 08:00:00) [1]

Первый пример - с использованием Canvas.Pixels, второй - библиотеки из статьи "Поставить точку"

procedure TForm1.Button1Click(Sender: TObject);
var
 b16m, bmono: TBitmap;
 x, y: Integer;
 r, g, b: byte;
 col: TColor;
begin
 b16m := TBitmap.Create;
 bmono := TBitmap.Create;
 b16m.LoadFromFile('pic.bmp');
 bmono.Width := b16m.Width;
 bmono.Height := b16m.Height;
 bmono.PixelFormat := pf1bit;
 for x := 0 to b16m.width - 1 do
   for y := 0 to b16m.Height - 1 do begin
     col := b16m.Canvas.pixels[x, y];
     r := GetRValue(col);
     g := GetGValue(col);
     b := GetBValue(col);
     bmono.Canvas.Pixels[x, y] := ((77 * R + 151 * G + 28 * B) shr 15) * $FFFFFF;
   end;
 Canvas.Draw(0, 0, b16m);
 Canvas.Draw(b16m.Width, 0, bmono);
end;

procedure TForm1.Button2Click(Sender: TObject);
var
 b16m, bmono: TBitmap;
 q, qm: TQuickPixels;
 x, y: Integer;
 r, g, b: byte;
 col: TColor;
begin
 b16m := TBitmap.Create;
 b16m.PixelFormat := pf24bit;
 bmono := TBitmap.Create;
 b16m.LoadFromFile('pic.bmp');
 b16m.PixelFormat := pf24bit;
 bmono.PixelFormat := pf1bit;
 bmono.Width := b16m.Width;
 bmono.Height := b16m.Height;
 bmono.PixelFormat := pf1bit;
 q := TQuickPixels.Create;
 q.Attach(b16m);
 qm := TQuickPixels.Create;
 qm.Attach(bmono);
 qm.ByPaletteIndex := True;
 for x := 0 to q.width - 1 do
   for y := 0 to q.Height - 1 do begin
     col := q[x, y];
     r := GetRValue(col);
     g := GetGValue(col);
     b := GetBValue(col);
     qm[x, y] := (77 * R + 151 * G + 28 * B) shr 15;
   end;
 Canvas.Draw(0, 0, b16m);
 Canvas.Draw(b16m.Width, 0, bmono);
end;


ИМХО   (2004-03-04 07:37:00) [2]

Но в любом случе PixelFormat не меняется, верно? (если работать с TBitmap)
Если поменять PixelFormat на pf1bit получается вроде бы монохромность, но резкости уже нет (то есть символы на картинке становятся трудноразличыми).


ИМХО   (2004-03-04 07:37:00) [3]

трудно различимыми


MBo   (2004-03-04 07:07:00) [4]

>ИМХО ©   (03.03.04 19:05) [5]
Я писал навскидку, так что проверь тщательно. После сдвига на 8 должна получаться яркость в диапазоне 0..255, еще на 7 - 0 или 1, причем эти значения назначать нужно уже в двуцветном растре.


ИМХО   (2004-03-04 04:52:00) [5]

Зачем мне Фотошоп? Мне нужно программноперевести картинку из true color в монохромную.


dmk   (2004-03-03 21:12:00) [6]

Для совсем хорошего перевода требуется "растеризовать" изображение. Алгоритма не подскажу, но как делается смотри
PhotoShop -> Image -> Mode -> Bitmap -> Halftone Screening.
Вид растра подбирай по ситуации. Наиболее удачным считается
круглый растр. Но иногда линейный выглядит эффектней.
По крайней мере, PhotoShop перед печатью на монохромный принтер
преобразует RGB, CMYK и т.д. растры в монохромный.


ИМХО   (2004-03-03 19:11:00) [7]


> Mantic0re   (03.03.04 18:04) [4]
> В зависимости от класса изображения (фотография, текстура..),
> качества и скорости работы подбирается требуемый алгоритм.


Нет, не фотография, а текст на картинках (как бы снимок страницы документа).


ИМХО   (2004-03-03 19:05:00) [8]

Если сдвигать на 15, то картинка получается полностью черная :(


Mantic0re   (2004-03-03 18:04:00) [9]

Реально - у тебя получится не лучше.

Для получения качественной монохромной картинки надо использовать так называемый метод дизеринга ("dithering"). Существует несколько методов dithering - самый быстрый ordered он преобразует изображение "в сеточку" как в газетах, алгоритмы Floyd & Steindberg более медленны, но и дают лучшее качество изображения.

В зависимости от класса изображения (фотография, текстура..), качества и скорости работы подбирается требуемый алгоритм.


ИМХО   (2004-03-03 06:35:00) [10]

Спасибо, сейчас буду пробовать!!!


MBo   (2004-03-03 06:29:00) [11]

P.S.
Это в градациях серого. Если нужно черно-белое, сдвигай не на 8 разрядов, а на 15 (еще на 128 разделить)


MBo   (2004-03-03 06:28:00) [12]

http://www.delphimaster.ru/cgi-bin/forum.pl?id=1077973068&n=7


Наверх

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