type
TRGB=record
b,g,r : byte;
end;
Type
ARGB=array [0..1] of TRGB;
PARGB=^ARGB;
procedure BlackWhite(image : tbitmap);
var
i, j, c : integer;
p : PARGB;
begin
image.PixelFormat:=pf24bit;
for i:=0 to image.Height-1 do
begin
p:=image.ScanLine[i];
for j:=0 to image.Width-1 do
begin
c:=round(0.3*p[j].r+0.59*p[j].g+0.11*p[j].b);
if c>=128 then c:=255 else c:=0; //эту строку надо убрать чтобы получить градации серого
p[j].r:=c;
p[j].g:=c;
p[j].b:=c;
end;
end;
end;
но как добится коричневатого оттенка, я не знаю. Ещё необходимо создать шумы, помехи и всё-такое(от этого я вообще в истерике ) Кто знает, помогите плз. Желательно с использованием функций WinApi(но не обязательно)
Ох, давно это было - курс компьютерной графики, но попытаюсь вспомнить. В общем, если фотография чисто серая - то все ее цвета лежат на прямой линии rgb(0,0,0) - rgb(255,255,255). А если нужно, чтобы фотография имела какой-то оттенок(rgb(r1,g1,b1)), то эта прямая превращается в ломаную rgb(0,0,0) - rgb(r1,g1,b1) - rgb(255,255,255). Находите среднее арифметическое r,g,b для каждого пикселя - получаете серый цвет. Теперь надо вычислить общую длину получившейся ломаной (по теореме Пифагора, sqrt(sqr(r1)+sqr(b1)+sqr(g1))+sqrt(sqr(255-r1)+sqr(255-g1+sqr(255-b1)). Далее вычисляется, какая часть длины ломаной приходится на первый отрезок (от 0 до точки излома), а какая на второй (от точки излома до 255). Соответственно с этим, например, если длина первого отрезка составляет четверть всей ломаной, а второго - три четверти, то при среднем арифметическом r,g,b конкретной точки, меньшим четверти от 255 (т.е. 64) она ляжет на первый отрезок, если больше - на второй. Дальше тут идет уже чистая алгебра.
Что касается шумов и помех - можно хаотически накладывать на изображение светло-серые и темно-серые штрихи и круги малого радиуса.
Искусство программирования - заставить компьютер делать все то, что вам делать лень.
Для "спасибо" есть кнопка "Спасибо" в виде звездочки внизу под ником автора поста.
Найди RGB значения коричневого цвета, потом каждое из R G и B умножь на яркость градации серого (в твоем случае это - С). Т.е. например:
R1 := (R * C) div 256; или R1 := (R*C) shr 8;
G1 := (G * C) div 256; или R1 := (R*C) shr 8;
B1 := (B * C) div 256; или R1 := (R*C) shr 8;
Получишь изображение с нужным оттенком заданного цвета RGB
" писал(а):Ещё необходимо создать шумы, помехи и всё-такое(от этого я вообще в истерике ) Кто знает, помогите плз. Желательно с использованием функций WinApi(но не обязательно)
Вы думаете в WinAPI реализованы помехи? Хотя идея неплохая, надо предложить мелкософту забить туда типичные задачи пользователя :-)
Шумы можно генерить самому, можно, например, создать группу точек на плоскости (Х) изображения. У каждой точки (Х) будут координаты и амплитуда. В зависимости от выбраной точки изображения расстояние до точек (Х) будет определять долю изменяемой амплитуды. Т.е. допустим есть одна точка с коор. X,Y и амп. A. Пусть X1,Y1 - коорд. точки изображения, R,G,B - ее цвет, тогда
а если взять две фотографии, одну нормальную, другую как текстуру шумов, трещинок и т.д. и объединить их по точкам, должно быть достаточно просто. С помощью текстуры можно определить и оттенок фотографии да и многое другое. А объединение можно осуществить уже WinApi (например StretchBlt или BitBlt и поиграться с параметром объединения цветов)