Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Media";
Текущий архив: 2004.05.23;
Скачать: [xml.tar.bz2];

Вниз

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

 
ИМХО ©   (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 вся ветка

Форум: "Media";
Текущий архив: 2004.05.23;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.035 c
3-1082804326
Кирилл Негодов
2004-04-24 14:58
2004.05.23
Вычисляемые поля.


14-1083517833
Date?
2004-05-02 21:10
2004.05.23
Дата в анкете


1-1083663681
Islander
2004-05-04 13:41
2004.05.23
Как определить, включены ли темы в XP?


3-1082840316
kaif
2004-04-25 00:58
2004.05.23
Есть ли способ ALTER COLUMN для COMPUTED BY ?


1-1083697130
СанСаныч
2004-05-04 22:58
2004.05.23
Дополнительные компоненты





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский