- •Методические указания и задания
- •Методические указания к выполнению курсовой работы
- •1 Формат файла bmp
- •2 Формат файла pcx
- •Критические блоки
- •Заголовочный блок
- •Палитра
- •Блок данных изображения
- •Замыкающий блок изображения
- •Вспомогательные блоки
- •Данные изображения
- •Альфа канал
- •Задание к курсовой работе
- •Содержание
Задание к курсовой работе
В соответствии с вариантом написать программу для просмотра файлов заданного графического формата. Для данного формата реализовать специальные эффекты. Формат файла и эффекты, которые необходимо применить заданы в таблицах ниже.
Таблица 9
№ |
Формат Файла |
Последовательность действий | |||||
1 |
2 |
3 |
4 |
5 |
6 | ||
1 |
BMP |
1 |
5 |
17 |
32 |
14 |
33 |
2 |
PCX сж |
2 |
9 |
18 |
31 |
11 |
34 |
3 |
BMP |
3 |
11 |
19 |
30 |
8 |
34 |
4 |
TGA |
4 |
14 |
20 |
29 |
5 |
35 |
5 |
TIFF |
1 |
6 |
21 |
32 |
15 |
37 |
6 |
BMP |
2 |
10 |
22 |
31 |
12 |
35 |
7 |
TIFF |
3 |
12 |
23 |
30 |
9 |
38 |
8 |
GIF |
4 |
15 |
24 |
29 |
6 |
33 |
9 |
PCX сж |
1 |
7 |
25 |
17 |
32 |
35 |
10 |
PCX |
2 |
8 |
26 |
18 |
31 |
36 |
11 |
GIF |
3 |
13 |
27 |
19 |
30 |
34 |
12 |
JPG |
4 |
16 |
28 |
20 |
29 |
35 |
13 |
BMP |
1 |
5 |
29 |
21 |
32 |
36 |
14 |
TIFF |
2 |
9 |
30 |
22 |
31 |
39 |
15 |
GIF |
3 |
11 |
31 |
23 |
30 |
35 |
16 |
BMP |
4 |
14 |
32 |
24 |
29 |
37 |
17 |
TGA |
1 |
6 |
17 |
25 |
32 |
37 |
18 |
TIFF |
2 |
10 |
18 |
26 |
31 |
33 |
19 |
PCX сж |
3 |
12 |
19 |
27 |
30 |
37 |
20 |
PCX |
4 |
15 |
20 |
28 |
29 |
38 |
21 |
TGA |
1 |
7 |
21 |
32 |
16 |
36 |
22 |
TIFF |
2 |
8 |
22 |
31 |
13 |
34 |
23 |
BMP |
3 |
13 |
23 |
30 |
10 |
38 |
24 |
GIF |
4 |
16 |
24 |
29 |
7 |
36 |
25 |
PCX |
1 |
5 |
25 |
32 |
14 |
39 |
Таблица 10
№ действия |
Действие |
1 |
Разложить по цветовому базису R G B |
2 |
Разложить по цветовому базису C M Y |
3 |
Разложить по цветовому базису H S V |
4 |
Разложить по цветовому базису H L S |
5 |
Зашумить состовляющую R |
6 |
Зашумить состовляющую G |
7 |
Зашумить состовляющую B |
8 |
Зашумить состовляющую C |
9 |
Зашумить состовляющую M |
10 |
Зашумить состовляющую Y |
11 |
Зашумить состовляющую H |
12 |
Зашумить состовляющую S |
13 |
Зашумить состовляющую V |
14 |
Зашумить состовляющую H |
15 |
Зашумить состовляющую L |
16 |
Зашумить состовляющую S |
17 |
Негатив изображения |
18 |
Отфильтровать фильтром 1 |
19 |
Отфильтровать фильтром 2 |
20 |
Отфильтровать фильтром 3 |
21 |
Отфильтровать фильтром 4 |
22 |
Отфильтровать фильтром 5 |
23 |
Отфильтровать фильтром 6 |
24 |
Отфильтровать фильтром 7 |
25 |
Отфильтровать фильтром 8 |
26 |
Отфильтровать фильтром 9 |
27 |
Отфильтровать фильтром 10 |
28 |
Отфильтровать фильтром 11 |
29 |
Преобразовать в базис в R G B |
30 |
Преобразовать в базис в C M Y |
31 |
Преобразовать в базис в H S V |
32 |
Преобразовать в базис в H L S |
33 |
Сохранить как BMP |
34 |
Сохранить как PCX несжатый |
35 |
Сохранить как PCX сжатый |
36 |
Сохранить как TGA |
37 |
Сохранить как TIFF |
38 |
Сохранить как GIF |
39 |
Сохранить как PNG |
Матрицы фильтров:
1
-2 |
1 |
-2 |
1 |
5 |
1 |
-2 |
1 |
-2 |
2
0 |
-1 |
0 |
-1 |
5 |
-1 |
0 |
-1 |
0 |
3
-1 |
-2 |
-1 |
-2 |
13 |
-2 |
-1 |
-2 |
-1 |
4
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
5
1 |
1 |
1 |
1 |
2 |
1 |
1 |
1 |
1 |
6
1 |
2 |
1 |
2 |
4 |
2 |
1 |
2 |
1 |
7
0 |
-1 |
0 |
-1 |
4 |
-1 |
0 |
-1 |
0 |
8
-1 |
-2 |
-1 |
-2 |
13 |
-2 |
-2 |
-2 |
-1 |
9
-1 |
-1 |
-1 |
-1 |
-8 |
-1 |
-1 |
-1 |
-1 |
10
1 |
1 |
1 |
1 |
-2 |
1 |
-1 |
-1 |
-1 |
11
2 |
7 |
12 |
7 |
2 | ||
7 |
31 |
52 |
31 |
7 | ||
12 |
52 |
127 |
52 |
12 | ||
7 |
31 |
52 |
31 |
7 | ||
2 |
7 |
12 |
7 |
2 |
Требования к выполнению курсовой работы:
Курсовая работа должна быть выполнена в соответствии с вариантом и техническим заданием, утвержденным преподавателем.
Пояснительная записка к курсовой работе должна быть выполнена в соответсвии с правилами и требованиями, предъявляемыми к оформлению курсовых работ, и обязательно содержать следующие разделы:
1 Описание графического формата файла
2 Алгоритм отображения файлОВ
3 Алгоритмы реализации эффектов
4 Структура приложения
5 Выбор инструментальных средств для реализации программы, обоснование выбора
6 Описание основных модулей программы
6.1 Открытие файла
6.2 Использование эффектов
6.3 Сохранение файла
7 Тестирование, результаты работы программы
ЛИТЕРАТУРА:
«Основы компьютерной графики». Радио и связь 1997. Балашов В.М.
«Цветное телевидение». Радио и связь 1989. Жуков В.И.
«Растровые изображения». SMP 2001. Самолётов С.Л.
«Компьютерная графика» Sams 2000. Гофман В.И.
Приложение А - Графическая библиотека, содержащая примеры
// Графическая библиотека
unit GraphLib;
implementation
// Считывание цвета пикселя.(DIBits)
function GetArrPixel(XMax, x, y : integer; p : pointer) : integer; assembler;
begin
asm
mov ecx,XMax
lea ecx,[ecx*4]// ecx = XMax * 4
@@1: mov edx,x
lea edx,[edx*4]// edx = x * 4
push edx
mov eax,y
mul ecx // ecx = z * y
pop edx
add eax,edx // eax = z*y + x*4;
push esi
mov esi,p
add esi,eax
mov eax,[esi]
and eax,$00FFFFFF
mov Result,eax
pop esi
end;
end;
// Запись цвета пикселя.(DIBits)
procedure SetArrPixel(pix : cardinal; xmax, x, y : integer; p : pointer); assembler;
begin
asm
mov ecx,XMax
lea ecx,[ecx*4]// ecx = XMax * 4
@@1: mov edx,x
lea edx,[edx*4]// edx = x * 4
push edx
mov eax,y
mul ecx // ecx = z * y
pop edx
add eax,edx // eax = z*y + x*4;
mov edx,eax
push esi
mov eax,pix
mov esi,p
add esi,edx
mov dl,[esi+3]
mov [esi],eax
mov [esi+3],dl
pop esi
end;
end;
// RGB -> HSV ( 0=< (R,G,B,S,V) <=1 и 0=<H<=360 )
Procedure RGB_to_HSV(R,G,B : extended; var H,S,V : extended);
const undefined=359;
function max_of(Red,Green,Blue : extended) : extended;
var max : extended;
begin
if red>green then max:=red else max:=green;
if blue>max then max:=blue;
max_of:=max;
end;
function min_of(Red,Green,Blue : extended) : extended;
var min : extended;
begin
if red<green then min:=red else min:=green;
if blue<min then min:=blue;
min_of:=min;
end;
var Max_value, Min_value,diff,r_dist,g_dist,b_dist : extended;
begin
max_value:=max_of(R,G,B);
min_value:=min_of(R,G,B);
diff:=max_value-min_value;
V:=max_value;
if max_value<>0 then s:=(diff / max_value) else s:=0;
if s=0 then h:=undefined
else begin
r_dist:=(max_value-R) / diff;
g_dist:=(max_value-G) / diff;
b_dist:=(max_value-B) / diff;
if R=max_value
then H:=b_dist-g_dist
else if G=Max_value
then H:=2+r_dist-b_dist
else if B=max_value
then H:=4+g_dist-r_dist;
H:=H*60;
if H<0 then h:=h+360;
end;
end;
// HSV -> RGB ( 0=< (R,G,B,S,V) <=1 и 0=<H<=360 )
Procedure HSV_to_RGB(H,S,V : extended; var R,G,B : extended);
var f,p,q,t : extended ; i:integer;
begin
if S=0
then begin
R:=V;
G:=V;
B:=V;
end
else begin
if H=360 then H:=0;
H:=H/60;
I:=trunc(H); { the integer part of H }
f:=H-i;
p:=V*(1-S);
q:=V*(1-(S*f));
t:=V*(1-(S*(1-f)));
case i of
0: begin R:=V; G:=t; B:=p; end;
1: begin R:=q; G:=V; B:=p; end;
2: begin R:=p; G:=V; B:=t; end;
3: begin R:=p; G:=q; B:=V; end;
4: begin R:=t; G:=p; B:=V; end;
5: begin R:=V; G:=p; B:=q; end;
end;
end;
end;
// RGB->YIQ
procedure RGB_to_YIQ(R,G,B : byte ; var Y,I,Q : byte);
var r1, g1, b1 : extended;
begin
r1 := R/255; g1 := G/255; b1 := B/255;
Y := Trunc(( 0.299 * r1 + 0.587 * g1 + 0.114 * b1)*255);
I := Trunc((((0.596 * r1 - 0.275 * g1 - 0.321 * b1)+0.596)/1.192)*255);
Q := Trunc((((0.212 * r1 - 0.523 * g1 + 0.311 * b1)+0.523)/1.046)*255);
end;
// YIQ -> RGB
procedure YIQ_to_RGB(Y,I,Q : byte ; var R,G,B : byte);
var y1,i1,q1 : extended;
rr,gg,bb : integer;
begin
y1 := Y/255; i1 := I/255; q1 := Q/255;
Rr := Trunc(abs((y1 + 0.956 * (i1 * 1.192 -0.596) + 0.621 * (q1 * 1.046 -0.523)))*255);
if Rr > 255 then Rr := 255;
if Rr < 0 then Rr := 0;
R := Lo(Rr);
Gg := Trunc(abs((y1 - 0.272 * (i1 * 1.192 -0.596) - 0.647 * (q1 * 1.046 -0.523)))*255);
if Gg > 255 then Gg := 255;
if Gg < 0 then Gg := 0;
G := Lo(Gg);
Bb := Trunc(abs((y1 - 1.106 * (i1 * 1.192 -0.596) + 1.703 * (q1 * 1.046 -0.523)))*255);
if Bb > 255 then Bb := 255;
if Bb < 0 then Bb := 0;
B := Lo(Bb);
end;
// RGB -> CMY
procedure RGB_to_CMY(R,G,B : byte; var C,M,Y : byte);
begin
Y := 255 - B;
M := 255 - G;
C := 255 - R;
end;
// CMY -> RGB
procedure CMY_to_RGB(C,M,Y : byte; var R,G,B : byte);
begin
R := 255 - C;
G := 255 - M;
B := 255 - Y;
end;
// Негатив изображения
function Negative(Num,Xs,Ys : integer) : boolean;
var x, y : integer;
t, e : cardinal;
begin
dec(Xs);
dec(Ys);
for y := 0 to Ys do
for x := 0 to Xs do begin
t := GetArrPixel(Xs + 1 , x, Ys-y, PictArrs[Num]);
asm
mov eax,t
not eax
mov e,eax
end;
SetArrPixel( e, Xs + 1, x, Ys-y, PictArrs[Num]);
end;
Result := True;
end;
// Миксование белого шума к изображению.
function Noise(Num,Level,Xs,Ys : integer) : boolean;
var x, y : integer;
t, e : cardinal;
nr : integer;
r,g,b : integer;
begin
dec(Xs);
dec(Ys);
for y := 0 to Ys do
for x := 0 to Xs do begin
t := GetArrPixel(Xs + 1 , x, Ys-y, PictArrs[Num]);
r := (t and $FF0000) shr 16;
g := (t and $FF00) shr 8;
b := t and $FF;
nr := Level - random (Level*2);
r := r + nr;
g := g + nr;
b := b + nr;
if r < 0 then r := 0 else if r > 255 then r := 255;
if g < 0 then g := 0 else if g > 255 then g := 255;
if b < 0 then b := 0 else if b > 255 then b := 255;
e := b or (g shl 8) or (r shl 16);
SetArrPixel( e, Xs + 1, x, Ys-y, PictArrs[Num]);
end;
Result := True;
end;
// Собственно разложение .
procedure ConvertTo3Basis(Conv,XMax,YMax : integer; PSource : pointer;
var PDest1, PDest2, PDest3 : pointer);
var x,y : integer;
R, G, B : byte;
Y_,I_,Q_ : byte;
h, s, v : extended;
t,
e1, e2, e3 : integer;
begin
for y := 0 to YMax do begin
for x := 0 to XMax do begin
t := GetArrPixel(XMax+1, x, YMax-y, PSource);
R := Lo((t and $FF0000) shr 16);
G := Lo((t and $FF00) shr 8);
B := Lo(t and $FF);
case Conv of
cRGB : asm
mov ecx,t
mov eax,ecx
and eax,$FF0000
mov edx,eax
shr eax,8
mov al,ah
add eax,edx
mov e1,eax
mov eax,ecx
and eax,$FF00
mov al,ah
xor edx,edx
mov dh,al
shl edx,8
or eax,edx
mov e2,eax
mov eax,ecx
and eax,$FF
mov ah,al
xor edx,edx
mov dl,al
shl edx,16
or eax,edx
mov e3,eax
end;
cCMY : asm
mov eax,t
mov ecx,eax
xor edx,edx
and eax,$FF0000
shr eax,16
mov ah,al
mov dl,al
shl edx,16
add eax,edx
not eax
and eax,$FFFFFF
mov e1,eax
mov eax,ecx
xor edx,edx
and eax,$FF00
mov al,ah
mov dl,al
shl edx,16
add eax,edx
not eax
and eax,$FFFFFF
mov e2,eax
mov eax,ecx
xor edx,edx
and eax,$FF
mov ah,al
mov dl,al
shl edx,16
add eax,edx
not eax
and eax,$FFFFFF
mov e3,eax
end;
cYIQ : begin
RGB_to_YIQ(R,G,B ,Y_,I_,Q_);
e1 := Y_ or (Y_ shl 8) or (Y_ shl 16);
e2 := I_ or (I_ shl 8) or (I_ shl 16);
e3 := Q_ or (Q_ shl 8) or (Q_ shl 16);
end;
cHLS : begin
RGB_to_HSV(R/255, G/255, b/255, h, s, v);
e1 := Round(h*0.7083332);
e2 := Round(s*255);
e3 := Round(v*255);
e1 := e1 or (e1 shl 8) or (e1 shl 16);
e2 := e2 or (e2 shl 8) or (e2 shl 16);
e3 := e3 or (e3 shl 8) or (e3 shl 16);
end;
end;
SetArrPixel( e1, XMax+1, x, YMax-y, PDest1);
SetArrPixel( e2, XMax+1, x, YMax-y, PDest2);
SetArrPixel( e3, XMax+1, x, YMax-y, PDest3);
end;
end;
end;
// Фильтр Dimension = 3,5 - размерность матрицы фильтра. Iter - порядок фильтра (1 или 2).
procedure Filtrate(Pict : pointer; XSize, YSize, Dimension, Iter : integer);
var pt2 : pointer;
x, y, u, v,
x1, x2, x3, x4, x5 ,
y1, y2, y3, y4, y5 : integer;
r, g, b : extended;
rc, gc, bc : cardinal;
Pix : array[1..5,1..5] of Cardinal;
Flag : boolean;
begin
Flag := True;
if Dimension = 5 then Flag := False;
// Создаем копию изображения
pt2 := AllocMemo(GetMemoSize(Pict));
CopyToMem(Pict,pt2,GetMemoSize(Pict));
// Собственно фильтрация
if not Flag then begin // фильтр 5x5
for y := 0 to YSize do begin
for x := 0 to XSize do begin
asm
push esi // x1 - ebx, x2 - ecx, x3 - eax x4 - edx
push edi //x1 := x - 2; if x1 < 0 then x1 := x;
//x2 := x - 1; if x2 < 0 then x2 := x;
mov esi,XSize //x3 := x ;
mov edi,YSize //x4 := x + 1; if x4 > XSize then x4 := x;
//x5 := x + 2; if x5 > XSize then x5 := x;
mov eax,x //y1 := y - 2; if y1 < 0 then y1 := y;
mov x3,eax //y2 := y - 1; if y2 < 0 then y2 := y;
//y3 := y ;
inc eax //y4 := y + 1; if y4 > YSize then y4 := y;
cmp eax,esi //y5 := y + 2; if y5 > YSize then y5 := y;
jbe @@1
dec eax
@@1: mov x4,eax
inc eax
cmp eax,esi
jbe @@2
dec eax
@@2: mov x5,eax
mov eax,x
dec eax
jge @@3
inc eax
@@3: mov x2,eax
dec eax
jge @@4
inc eax
@@4: mov x1,eax
mov eax,y
mov y3,eax
inc eax
cmp eax,edi
jbe @@5
dec eax
@@5: mov y4,eax
inc eax
cmp eax,edi
jbe @@6
dec eax
@@6: mov y5,eax
mov eax,y
dec eax
jge @@7
inc eax
@@7: mov y2,eax
dec eax
jge @@8
inc eax
@@8: mov y1,eax
pop edi
pop esi
end;
if Iter=1 then begin
Pix[1,1] := GetArrPixel(XSize+1,x1,YSize-y1,pt2);
Pix[1,2] := GetArrPixel(XSize+1,x1,YSize-y2,pt2);
Pix[1,3] := GetArrPixel(XSize+1,x1,YSize-y3,pt2);
Pix[1,4] := GetArrPixel(XSize+1,x1,YSize-y4,pt2);
Pix[1,5] := GetArrPixel(XSize+1,x1,YSize-y5,pt2);
Pix[2,1] := GetArrPixel(XSize+1,x2,YSize-y1,pt2);
Pix[2,2] := GetArrPixel(XSize+1,x2,YSize-y2,pt2);
Pix[2,3] := GetArrPixel(XSize+1,x2,YSize-y3,pt2);
Pix[2,4] := GetArrPixel(XSize+1,x2,YSize-y4,pt2);
Pix[2,5] := GetArrPixel(XSize+1,x2,YSize-y5,pt2);
Pix[3,1] := GetArrPixel(XSize+1,x3,YSize-y1,pt2);
Pix[3,2] := GetArrPixel(XSize+1,x3,YSize-y2,pt2);
end
else begin
Pix[1,1] := GetArrPixel(XSize+1,x1,YSize-y1,Pict);
Pix[1,2] := GetArrPixel(XSize+1,x1,YSize-y2,Pict);
Pix[1,3] := GetArrPixel(XSize+1,x1,YSize-y3,Pict);
Pix[1,4] := GetArrPixel(XSize+1,x1,YSize-y4,Pict);
Pix[1,5] := GetArrPixel(XSize+1,x1,YSize-y5,Pict);
Pix[2,1] := GetArrPixel(XSize+1,x2,YSize-y1,Pict);
Pix[2,2] := GetArrPixel(XSize+1,x2,YSize-y2,Pict);
Pix[2,3] := GetArrPixel(XSize+1,x2,YSize-y3,Pict);
Pix[2,4] := GetArrPixel(XSize+1,x2,YSize-y4,Pict);
Pix[2,5] := GetArrPixel(XSize+1,x2,YSize-y5,Pict);
Pix[3,1] := GetArrPixel(XSize+1,x3,YSize-y1,Pict);
Pix[3,2] := GetArrPixel(XSize+1,x3,YSize-y2,Pict);
end;
Pix[3,3] := GetArrPixel(XSize+1,x3,YSize-y3,pt2);
Pix[3,4] := GetArrPixel(XSize+1,x3,YSize-y4,pt2);
Pix[3,5] := GetArrPixel(XSize+1,x3,YSize-y5,pt2);
Pix[4,1] := GetArrPixel(XSize+1,x4,YSize-y1,pt2);
Pix[4,2] := GetArrPixel(XSize+1,x4,YSize-y2,pt2);
Pix[4,3] := GetArrPixel(XSize+1,x4,YSize-y3,pt2);
Pix[4,4] := GetArrPixel(XSize+1,x4,YSize-y4,pt2);
Pix[4,5] := GetArrPixel(XSize+1,x4,YSize-y5,pt2);
Pix[5,1] := GetArrPixel(XSize+1,x5,YSize-y1,pt2);
Pix[5,2] := GetArrPixel(XSize+1,x5,YSize-y2,pt2);
Pix[5,3] := GetArrPixel(XSize+1,x5,YSize-y3,pt2);
Pix[5,4] := GetArrPixel(XSize+1,x5,YSize-y4,pt2);
Pix[5,5] := GetArrPixel(XSize+1,x5,YSize-y5,pt2);
r := 0;
g := 0;
b := 0;
for u := 1 to 5 do
for v := 1 to 5 do begin
r := r + Filtr[u,v]*(Pix[u,v] and $000000FF);
g := g + Filtr[u,v]*((Pix[u,v] and $0000FF00) shr 8);
b := b + Filtr[u,v]*((Pix[u,v] and $00FF0000) shr 16);
end;
if r < 0 then r := 0;
if g < 0 then g := 0;
if b < 0 then b := 0;
rc := Round( r * FiltrCoeff);if rc > 255 then rc := 255;
gc := Round( g * FiltrCoeff);if gc > 255 then gc := 255;
bc := Round( b * FiltrCoeff);if bc > 255 then bc := 255;
SetArrPixel( rc or ( gc shl 8) or ( bc shl 16),
XSize+1,x,YSize-y,Pict );
end;
end
end
else begin // фильтр 3x3
for y := 0 to YSize do begin
for x := 0 to XSize do begin
asm
push esi
push edi
//x2 := x - 1; if x2 < 0 then x2 := x;
mov esi,XSize //x3 := x ;
mov edi,YSize //x4 := x + 1; if x4 > XSize then x4 := x;
mov eax,x
mov x3,eax //y2 := y - 1; if y2 < 0 then y2 := y;
//y3 := y ;
inc eax //y4 := y + 1; if y4 > YSize then y4 := y;
cmp eax,esi
jbe @@1
dec eax
@@1: mov x4,eax
mov eax,x
dec eax
jge @@3
inc eax
@@3: mov x2,eax
mov eax,y
mov y3,eax
inc eax
cmp eax,edi
jbe @@5
dec eax
@@5: mov y4,eax
mov eax,y
dec eax
jge @@7
inc eax
@@7: mov y2,eax
pop edi
pop esi
end;
if Iter=1 then begin
Pix[2,2] := GetArrPixel(XSize+1,x2,YSize-y2,pt2);
Pix[2,3] := GetArrPixel(XSize+1,x2,YSize-y3,pt2);
Pix[2,4] := GetArrPixel(XSize+1,x2,YSize-y4,pt2);
Pix[3,2] := GetArrPixel(XSize+1,x3,YSize-y2,pt2);
end
else begin
Pix[2,2] := GetArrPixel(XSize+1,x2,YSize-y2,Pict);
Pix[2,3] := GetArrPixel(XSize+1,x2,YSize-y3,Pict);
Pix[2,4] := GetArrPixel(XSize+1,x2,YSize-y4,Pict);
Pix[3,2] := GetArrPixel(XSize+1,x3,YSize-y2,Pict);
end;
Pix[3,3] := GetArrPixel(XSize+1,x3,YSize-y3,pt2);
Pix[3,4] := GetArrPixel(XSize+1,x3,YSize-y4,pt2);
Pix[4,2] := GetArrPixel(XSize+1,x4,YSize-y2,pt2);
Pix[4,3] := GetArrPixel(XSize+1,x4,YSize-y3,pt2);
Pix[4,4] := GetArrPixel(XSize+1,x4,YSize-y4,pt2);
r := 0;
g := 0;
b := 0;
for u := 2 to 4 do
for v := 2 to 4 do begin
r := r + Filtr[u,v]*(Pix[u,v] and $000000FF);
g := g + Filtr[u,v]*((Pix[u,v] and $0000FF00) shr 8);
b := b + Filtr[u,v]*((Pix[u,v] and $00FF0000) shr 16);
end;
if r < 0 then r := 0;
if g < 0 then g := 0;
if b < 0 then b := 0;
rc := Round( r * FiltrCoeff);if rc > 255 then rc := 255;
gc := Round( g * FiltrCoeff);if gc > 255 then gc := 255;
bc := Round( b * FiltrCoeff);if bc > 255 then bc := 255;
SetArrPixel( rc or ( gc shl 8) or ( bc shl 16),
XSize+1,x,YSize-y,Pict );
end;
end
end;
FreeMemo(pt2);
end;
// Сложение изображений ( или изображения с константой)
function PAdd(Num1, Num2, Num3, Oper2, Xs, Ys : integer;
Coeff1, Coeff2 : extended) : boolean;
var x, y : integer;
t1, t2, e : cardinal;
r, g, b,
r1, g1, b1,
r2, g2, b2 : integer;
begin
dec(Xs);
dec(Ys);
for y := 0 to Ys do
for x := 0 to Xs do begin
t1 := GetArrPixel(Xs+1, x, Ys-y, PictArrs[Num1]);
if Num2>0
then t2 := GetArrPixel(Xs+1, x, Ys-y, PictArrs[Num2])
else t2 := Oper2;
r1 := Trunc(((t1 and $FF0000) shr 16) * Coeff1);
g1 := Trunc(((t1 and $FF00) shr 8) * Coeff1);
b1 := Trunc((t1 and $FF) * Coeff1);
r2 := Trunc(((t2 and $FF0000) shr 16) * Coeff2);
g2 := Trunc(((t2 and $FF00) shr 8) * Coeff2);
b2 := Trunc((t2 and $FF) * Coeff2);
asm // if (r1,g1,b1,r2,g2,b2) > 255 then (r1,g1,b1,r2,g2,b2)=255
mov edx,$FF
mov ecx,$FFFFFF00
mov eax,r1
and eax,ecx
jz @@1
mov r1,edx
@@1: mov eax,r2
and eax,ecx
jz @@2
mov r2,edx
@@2: mov eax,g1
and eax,ecx
jz @@3
mov g1,edx
@@3: mov eax,g2
and eax,ecx
jz @@4
mov g2,edx
@@4: mov eax,b1
and eax,ecx
jz @@5
mov b1,edx
@@5: mov eax,b2
and eax,ecx
jz @@6
mov b2,edx
@@6: or eax,eax
end;
r := r1 + r2;
g := g1 + g2;
b := b1 + b2;
asm // if (r,g,b) > 255 then (r,g,b)=255 if (r,g,b) < 0 then (r,g,b)=0
mov edx,$FF
mov ecx,$FFFFFF00
mov eax,r
cmp eax,edx
jl @@1
mov r,edx
@@1: mov eax,g
cmp eax,edx
jl @@2
mov g,edx
@@2: mov eax,b
cmp eax,edx
jl @@3
mov b,edx
@@3: xor edx,edx
mov eax,r
and eax,eax
jg @@4
mov r,edx
@@4: mov eax,g
and eax,eax
jg @@5
mov g,edx
@@5: mov eax,b
and eax,eax
jg @@6
mov b,edx
@@6: or eax,eax
end;
e := b or (g shl 8) or (r shl 16);
SetArrPixel( e, Xs+1, x, Ys-y, PictArrs[Num3]);
end;{for}
end;
// Вычитание изображений ( или изображения с константой)
function PSub(Num1, Num2, Num3, Oper2, Xs, Ys : integer;
Coeff1, Coeff2 : extended) : boolean;
var x, y : integer;
t1, t2, e : cardinal;
r, g, b,
r1, g1, b1,
r2, g2, b2 : integer;
begin
dec(Xs);
dec(Ys);
for y := 0 to Ys do
for x := 0 to Xs do begin
t1 := GetArrPixel(Xs+1, x, Ys-y, PictArrs[Num1]);
if Num2>0
then t2 := GetArrPixel(Xs+1, x, Ys-y, PictArrs[Num2])
else t2 := Oper2;
r1 := Trunc(((t1 and $FF0000) shr 16) * Coeff1);
g1 := Trunc(((t1 and $FF00) shr 8) * Coeff1);
b1 := Trunc((t1 and $FF) * Coeff1);
r2 := Trunc(((t2 and $FF0000) shr 16) * Coeff2);
g2 := Trunc(((t2 and $FF00) shr 8) * Coeff2);
b2 := Trunc((t2 and $FF) * Coeff2);
asm // if (r1,g1,b1,r2,g2,b2) > 255 then (r1,g1,b1,r2,g2,b2)=255
mov edx,$FF
mov ecx,$FFFFFF00
mov eax,r1
and eax,ecx
jz @@1
mov r1,edx
@@1: mov eax,r2
and eax,ecx
jz @@2
mov r2,edx
@@2: mov eax,g1
and eax,ecx
jz @@3
mov g1,edx
@@3: mov eax,g2
and eax,ecx
jz @@4
mov g2,edx
@@4: mov eax,b1
and eax,ecx
jz @@5
mov b1,edx
@@5: mov eax,b2
and eax,ecx
jz @@6
mov b2,edx
@@6: or eax,eax
end;
r := r1 - r2;
g := g1 - g2;
b := b1 - b2;
asm // if (r,g,b) > 255 then (r,g,b)=255 if (r,g,b) < 0 then (r,g,b)=0
mov edx,$FF
mov ecx,$FFFFFF00
mov eax,r
cmp eax,edx
jl @@1
mov r,edx
@@1: mov eax,g
cmp eax,edx
jl @@2
mov g,edx
@@2: mov eax,b
cmp eax,edx
jl @@3
mov b,edx
@@3: xor edx,edx
mov eax,r
cmp eax,$0
jg @@4
mov r,edx
@@4: mov eax,g
cmp eax,$0
jg @@5
mov g,edx
@@5: mov eax,b
cmp eax,$0
jg @@6
mov b,edx
@@6: or eax,eax
end;
e := b or (g shl 8) or (r shl 16);
SetArrPixel( e, Xs+1, x, Ys-y, PictArrs[Num3]);
end;{for}
end;
// Перемножение изображений ( или изображения с константой)
function PMul(Num1, Num2, Num3, Oper2, Xs, Ys : integer;
Coeff1, Coeff2 : extended) : boolean;
var x, y : integer;
t1, t2, e : cardinal;
r, g, b,
r1, g1, b1,
r2, g2, b2 : integer;
begin
dec(Xs);
dec(Ys);
for y := 0 to Ys do
for x := 0 to Xs do begin
t1 := GetArrPixel(Xs+1, x, Ys-y, PictArrs[Num1]);
if Num2>0
then t2 := GetArrPixel(Xs+1, x, Ys-y, PictArrs[Num2])
else t2 := Oper2;
r1 := Trunc(((t1 and $FF0000) shr 16) * Coeff1);
g1 := Trunc(((t1 and $FF00) shr 8) * Coeff1);
b1 := Trunc((t1 and $FF) * Coeff1);
r2 := Trunc(((t2 and $FF0000) shr 16) * Coeff2);
g2 := Trunc(((t2 and $FF00) shr 8) * Coeff2);
b2 := Trunc((t2 and $FF) * Coeff2);
asm // if (r1,g1,b1,r2,g2,b2) > 255 then (r1,g1,b1,r2,g2,b2)=255
mov edx,$FF
mov ecx,$FFFFFF00
mov eax,r1
and eax,ecx
jz @@1
mov r1,edx
@@1: mov eax,r2
and eax,ecx
jz @@2
mov r2,edx
@@2: mov eax,g1
and eax,ecx
jz @@3
mov g1,edx
@@3: mov eax,g2
and eax,ecx
jz @@4
mov g2,edx
@@4: mov eax,b1
and eax,ecx
jz @@5
mov b1,edx
@@5: mov eax,b2
and eax,ecx
jz @@6
mov b2,edx
@@6: or eax,eax
end;
r := r1 * r2;
g := g1 * g2;
b := b1 * b2;
asm // if (r,g,b) > 255 then (r,g,b)=255 if (r,g,b) < 0 then (r,g,b)=0
mov edx,$FF
mov ecx,$FFFFFF00
mov eax,r
cmp eax,edx
jl @@1
mov r,edx
@@1: mov eax,g
cmp eax,edx
jl @@2
mov g,edx
@@2: mov eax,b
cmp eax,edx
jl @@3
mov b,edx
@@3: xor edx,edx
mov eax,r
and eax,eax
jg @@4
mov r,edx
@@4: mov eax,g
and eax,eax
jg @@5
mov g,edx
@@5: mov eax,b
and eax,eax
jg @@6
mov b,edx
@@6: or eax,eax
end;
e := b or (g shl 8) or (r shl 16);
SetArrPixel( e, Xs+1, x, Ys-y, PictArrs[Num3]);
end;{for}
end;
// Деление изображений ( или изображения на константу)
function PDiv(Num1, Num2, Num3, Oper2, Xs, Ys : integer;
Coeff1, Coeff2 : extended) : boolean;
var x, y : integer;
t1, t2, e : cardinal;
r, g, b,
r1, g1, b1,
r2, g2, b2 : integer;
begin
dec(Xs);
dec(Ys);
for y := 0 to Ys do
for x := 0 to Xs do begin
t1 := GetArrPixel(Xs+1, x, Ys-y, PictArrs[Num1]);
if Num2>0
then t2 := GetArrPixel(Xs+1, x, Ys-y, PictArrs[Num2])
else t2 := Oper2;
r1 := Trunc(((t1 and $FF0000) shr 16) * Coeff1);
g1 := Trunc(((t1 and $FF00) shr 8) * Coeff1);
b1 := Trunc((t1 and $FF) * Coeff1);
r2 := Trunc(((t2 and $FF0000) shr 16) * Coeff2);
g2 := Trunc(((t2 and $FF00) shr 8) * Coeff2);
b2 := Trunc((t2 and $FF) * Coeff2);
asm // Проверки для исключения деления на 0;
mov edx,$FF
mov ecx,1
mov edx,r2
or edx,edx
jnz @@1
mov r2,1
mov r1,$FF
@@1: mov edx,g2
or edx,edx
jnz @@2
mov g2,1
mov g1,$FF
@@2: mov edx,b2
or edx,edx
jnz @@3
mov b2,1
mov b1,$FF
@@3: or eax,eax
end;
asm // if (r1,g1,b1,r2,g2,b2) > 255 then (r1,g1,b1,r2,g2,b2)=255
mov edx,$FF
mov ecx,$FFFFFF00
mov eax,r1
and eax,ecx
jz @@1
mov r1,edx
@@1: mov eax,r2
and eax,ecx
jz @@2
mov r2,edx
@@2: mov eax,g1
and eax,ecx
jz @@3
mov g1,edx
@@3: mov eax,g2
and eax,ecx
jz @@4
mov g2,edx
@@4: mov eax,b1
and eax,ecx
jz @@5
mov b1,edx
@@5: mov eax,b2
and eax,ecx
jz @@6
mov b2,edx
@@6: or eax,eax
end;
r := r1 div r2;
g := g1 div g2;
b := b1 div b2;
asm // if (r,g,b) > 255 then (r,g,b)=255 if (r,g,b) < 0 then (r,g,b)=0
mov edx,$FF
mov ecx,$FFFFFF00
mov eax,r
cmp eax,edx
jl @@1
mov r,edx
@@1: mov eax,g
cmp eax,edx
jl @@2
mov g,edx
@@2: mov eax,b
cmp eax,edx
jl @@3
mov b,edx
@@3: xor edx,edx
mov eax,r
and eax,eax
jg @@4
mov r,edx
@@4: mov eax,g
and eax,eax
jg @@5
mov g,edx
@@5: mov eax,b
and eax,eax
jg @@6
mov b,edx
@@6: or eax,eax
end;
e := b or (g shl 8) or (r shl 16);
SetArrPixel( e, Xs+1, x, Ys-y, PictArrs[Num3]);
end;{for}
end;
// Логическое Сложение изображений ( или изображения с константой)
function POr(Num1, Num2, Num3, Oper2, Xs, Ys : integer;
Coeff1, Coeff2 : extended;Not_ : boolean) : boolean;
var x, y : integer;
t1, t2, e : cardinal;
r, g, b,
r1, g1, b1,
r2, g2, b2 : integer;
begin
dec(Xs);
dec(Ys);
for y := 0 to Ys do
for x := 0 to Xs do begin
t1 := GetArrPixel(Xs+1, x, Ys-y, PictArrs[Num1]);
if Num2>0
then t2 := GetArrPixel(Xs+1, x, Ys-y, PictArrs[Num2])
else t2 := Oper2;
r1 := Trunc(((t1 and $FF0000) shr 16) * Coeff1);
g1 := Trunc(((t1 and $FF00) shr 8) * Coeff1);
b1 := Trunc((t1 and $FF) * Coeff1);
r2 := Trunc(((t2 and $FF0000) shr 16) * Coeff2);
g2 := Trunc(((t2 and $FF00) shr 8) * Coeff2);
b2 := Trunc((t2 and $FF) * Coeff2);
r := r1 or r2;
g := g1 or g2;
b := b1 or b2;
e := b or (g shl 8) or (r shl 16);
if Not_ then e := (not e) and $FFFFFF;
SetArrPixel( e, Xs+1, x, Ys-y, PictArrs[Num3]);
end;{for}
end;
// Логическое умножение изображений ( или изображения с константой)
function PAnd(Num1, Num2, Num3, Oper2, Xs, Ys : integer;
Coeff1, Coeff2 : extended;Not_ : boolean) : boolean;
var x, y : integer;
t1, t2, e : cardinal;
r, g, b,
r1, g1, b1,
r2, g2, b2 : integer;
begin
dec(Xs);
dec(Ys);
for y := 0 to Ys do
for x := 0 to Xs do
begin
t1 := GetArrPixel(Xs+1, x, Ys-y, PictArrs[Num1]);
if Num2>0
then t2 := GetArrPixel(Xs+1, x, Ys-y, PictArrs[Num2])
else t2 := Oper2;
r1 := Trunc(((t1 and $FF0000) shr 16) * Coeff1);
g1 := Trunc(((t1 and $FF00) shr 8) * Coeff1);
b1 := Trunc((t1 and $FF) * Coeff1);
r2 := Trunc(((t2 and $FF0000) shr 16) * Coeff2);
g2 := Trunc(((t2 and $FF00) shr 8) * Coeff2);
b2 := Trunc((t2 and $FF) * Coeff2);
r := r1 and r2;
g := g1 and g2;
b := b1 and b2;
e := b or (g shl 8) or (r shl 16);
if Not_ then e := (not e) and $FFFFFF;
SetArrPixel( e, Xs+1, x, Ys-y, PictArrs[Num3]);
end;{for}
end;
// Логическое умножение по модулю 2 изображений ( или изображения с константой)
function PXor(Num1, Num2, Num3, Oper2, Xs, Ys : integer;
Coeff1, Coeff2 : extended;Not_ : boolean) : boolean;
var x, y : integer;
t1, t2, e : cardinal;
r, g, b,
r1, g1, b1,
r2, g2, b2 : integer;
begin
dec(Xs);
dec(Ys);
for y := 0 to Ys do
for x := 0 to Xs do
begin
t1 := GetArrPixel(Xs+1, x, Ys-y, PictArrs[Num1]);
if Num2>0
then t2 := GetArrPixel(Xs+1, x, Ys-y, PictArrs[Num2])
else t2 := Oper2;
r1 := Trunc(((t1 and $FF0000) shr 16) * Coeff1);
g1 := Trunc(((t1 and $FF00) shr 8) * Coeff1);
b1 := Trunc((t1 and $FF) * Coeff1);
r2 := Trunc(((t2 and $FF0000) shr 16) * Coeff2);
g2 := Trunc(((t2 and $FF00) shr 8) * Coeff2);
b2 := Trunc((t2 and $FF) * Coeff2);
r := r1 xor r2;
g := g1 xor g2;
b := b1 xor b2;
e := b or (g shl 8) or (r shl 16);
if Not_ then e := (not e) and $FFFFFF;
SetArrPixel( e, Xs+1, x, Ys-y, PictArrs[Num3]);
end;{for}
end;
initialization
Bitmaps := TList.Create;
finalization
Bitmaps.Free;
end.