эффект старой фотографии

Модераторы: Duncon, Naeel Maqsudov, Игорь Акопян, Хыиуду

Ответить
Ele$$ar
Сообщения: 2
Зарегистрирован: 03 дек 2006, 20:05

Мне нужно преобразовать изображение под старую фотографию. Есть вариант перевода в чёрно - белое состояние:

Код: Выделить всё

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;
но как добится коричневатого оттенка, я не знаю. Ещё необходимо создать шумы, помехи и всё-такое(от этого я вообще в истерике :confused: ) Кто знает, помогите плз. Желательно с использованием функций WinApi(но не обязательно)
Хыиуду
Сообщения: 2442
Зарегистрирован: 06 мар 2005, 21:03
Откуда: Москва
Контактная информация:

Ох, давно это было - курс компьютерной графики, но попытаюсь вспомнить. В общем, если фотография чисто серая - то все ее цвета лежат на прямой линии 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) она ляжет на первый отрезок, если больше - на второй. Дальше тут идет уже чистая алгебра.
Что касается шумов и помех - можно хаотически накладывать на изображение светло-серые и темно-серые штрихи и круги малого радиуса.
Искусство программирования - заставить компьютер делать все то, что вам делать лень.
Для "спасибо" есть кнопка "Спасибо" в виде звездочки внизу под ником автора поста.
Аватара пользователя
somewhere
Сообщения: 1858
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

Найди 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
Аватара пользователя
somewhere
Сообщения: 1858
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

&quot писал(а):Ещё необходимо создать шумы, помехи и всё-такое(от этого я вообще в истерике ) Кто знает, помогите плз. Желательно с использованием функций 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
Ele$$ar
Сообщения: 2
Зарегистрирован: 03 дек 2006, 20:05

да нет, я не про помехи, я имею в виду, вообще, если где-то в этой задачке можно воткнуть Api, то это весьма желательно :-)
Аватара пользователя
SergeyS
Сообщения: 196
Зарегистрирован: 21 ноя 2006, 17:12
Откуда: Хакасия, Абакан
Контактная информация:

а если взять две фотографии, одну нормальную, другую как текстуру шумов, трещинок и т.д. и объединить их по точкам, должно быть достаточно просто. С помощью текстуры можно определить и оттенок фотографии да и многое другое. А объединение можно осуществить уже WinApi :) (например StretchBlt или BitBlt и поиграться с параметром объединения цветов)
Ответить