Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
метод_курс_кэм_new.doc
Скачиваний:
14
Добавлен:
06.02.2016
Размер:
653.82 Кб
Скачать

Задание к курсовой работе

В соответствии с вариантом написать программу для просмотра файлов заданного графического формата. Для данного формата реализовать специальные эффекты. Формат файла и эффекты, которые необходимо применить заданы в таблицах ниже.

Таблица 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 Тестирование, результаты работы программы

ЛИТЕРАТУРА:

  1. «Основы компьютерной графики». Радио и связь 1997. Балашов В.М.

  2. «Цветное телевидение». Радио и связь 1989. Жуков В.И.

  3. «Растровые изображения». SMP 2001. Самолётов С.Л.

  4. «Компьютерная графика» 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.