Страница 1 из 1
эффект старой фотографии
Добавлено: 04 дек 2006, 01:39
Ele$$ar
Мне нужно преобразовать изображение под старую фотографию. Есть вариант перевода в чёрно - белое состояние:
Код: Выделить всё
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(но не обязательно)
Re: эффект старой фотографии
Добавлено: 04 дек 2006, 11:17
Хыиуду
Ох, давно это было - курс компьютерной графики, но попытаюсь вспомнить. В общем, если фотография чисто серая - то все ее цвета лежат на прямой линии 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) она ляжет на первый отрезок, если больше - на второй. Дальше тут идет уже чистая алгебра.
Что касается шумов и помех - можно хаотически накладывать на изображение светло-серые и темно-серые штрихи и круги малого радиуса.
Re: эффект старой фотографии
Добавлено: 04 дек 2006, 15:39
somewhere
Найди 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
Re: эффект старой фотографии
Добавлено: 04 дек 2006, 15:51
somewhere
" писал(а):Ещё необходимо создать шумы, помехи и всё-такое(от этого я вообще в истерике ) Кто знает, помогите плз. Желательно с использованием функций WinApi(но не обязательно)
Вы думаете в WinAPI реализованы помехи? Хотя идея неплохая, надо предложить мелкософту забить туда типичные задачи пользователя :-)
Шумы можно генерить самому, можно, например, создать группу точек на плоскости (Х) изображения. У каждой точки (Х) будут координаты и амплитуда. В зависимости от выбраной точки изображения расстояние до точек (Х) будет определять долю изменяемой амплитуды. Т.е. допустим есть одна точка с коор. X,Y и амп. A. Пусть X1,Y1 - коорд. точки изображения, R,G,B - ее цвет, тогда
D = sqrt(sqr(x-x1)+sqr(y-y1))
R1 = R*(1+A/sqrt(D))
G1 = G*(1+A/sqrt(D))
B1 = B*(1+A/sqrt(D))
А потом еще с Random поиздеваться, изменяя RGB значения на небольшую величину.
И не забыть про границы 0..255
Re: эффект старой фотографии
Добавлено: 04 дек 2006, 20:05
Ele$$ar
да нет, я не про помехи, я имею в виду, вообще, если где-то в этой задачке можно воткнуть Api, то это весьма желательно :-)
Re: эффект старой фотографии
Добавлено: 07 дек 2006, 15:01
SergeyS
а если взять две фотографии, одну нормальную, другую как текстуру шумов, трещинок и т.д. и объединить их по точкам, должно быть достаточно просто. С помощью текстуры можно определить и оттенок фотографии да и многое другое. А объединение можно осуществить уже WinApi

(например StretchBlt или BitBlt и поиграться с параметром объединения цветов)