Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.05.23;
Скачать: CL | DM;

Вниз

Монохромность   Найти похожие ветки 

 
ИМХО ©   (2004-03-03 05:56) [0]

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


 
MBo ©   (2004-03-03 06:28) [1]

http://delphimaster.net/view/8-1077973068/


 
MBo ©   (2004-03-03 06:29) [2]

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


 
ИМХО ©   (2004-03-03 06:35) [3]

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


 
Mantic0re   (2004-03-03 18:04) [4]

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

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

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


 
ИМХО ©   (2004-03-03 19:05) [5]

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


 
ИМХО ©   (2004-03-03 19:11) [6]


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


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


 
dmk ©   (2004-03-03 21:12) [7]

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


 
ИМХО ©   (2004-03-04 04:52) [8]

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


 
MBo ©   (2004-03-04 07:07) [9]

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


 
ИМХО ©   (2004-03-04 07:37) [10]

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


 
ИМХО ©   (2004-03-04 07:37) [11]

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


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

Первый пример - с использованием 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;



Страницы: 1 вся ветка

Текущий архив: 2004.05.23;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.038 c
3-1082550210
S@shka
2004-04-21 16:23
2004.05.23
Выборка по полю TDateTime FireBird 1.5


1-1083830145
Iraizor
2004-05-06 11:55
2004.05.23
TRichEdit , склейка разноцветных строк.


7-1081264318
alan2
2004-04-06 19:11
2004.05.23
Как в Дэлфи изменить настройки биоса под ХР виндой?


8-1078229290
gagarin
2004-03-02 15:08
2004.05.23
эффекты DirectX


1-1083932811
Magician
2004-05-07 16:26
2004.05.23
Как добавить картинку в DrawGrid