Обработка изображений с использованием расширения процессора

inc(j);

end;

end;//while

asm

pop edx

pop ecx

pop ebx

pop eax

end;

end;

//TrimInt - округление по указаным границам Integer

function TrimInt(Lower, Upper, theInteger: integer): integer;

begin

if (theInteger <= Upper) and (theInteger >= Lower) then

result := theInteger

else if theInteger > Upper then

result := Upper

else

result := Lower;

end;

//TrimReal - округление по указанным рамкам Real

function TrimReal(Lower, Upper: integer; x: double): integer;

begin

if (x < upper) and (x >= lower) then

result := trunc(x)

else if x > Upper then

result := Upper

else

result := Lower;

end;

//BlurRow - размытие строки без SSE

procedure BlurRow(var theRow: array of TPxlC; K: TKernel; P: PRow);

var

j, n: integer;

tr, tg, tb: double; //tempRed и др.

w: double;

begin

for j := 0 to High(theRow) do

begin

tb := 0;

tg := 0;

tr := 0;

for n := -K.Size to K.Size do

begin

w := K.Weights[n];

//TrimInt задает отступ от края строки .

with theRow[TrimInt(0, High(theRow), j - n)] do

begin

tb := tb + w * b;

tg := tg + w * g;

tr := tr + w * r;

end;//with

end;//for

with P[j] do

begin

b := TrimReal(0, 255, tb);

g := TrimReal(0, 255, tg);

r := TrimReal(0, 255, tr);

end;

end;

Move(P[0], theRow[0], (High(theRow) + 1) * Sizeof(TPxlC));

end;

//GBlur - полное размытие картинки

procedure GBlur(theBitmap: TBitmap; radius: double; withSSE:boolean);

var

Row, Col: integer;

theRows: PPRows;

K: TKernel;

ACol: PRow;

P: PRow;

begin

if (theBitmap.HandleType <> bmDIB) or (theBitmap.PixelFormat <> pf24Bit) then

raise

exception.Create('GBlur может работать только с 24-битными изображениями');

if (withSSE) then MakeGaussianKernelSSE(K, radius, 255, 1)

else MakeGaussianKernel(K, radius, 255, 1);

GetMem(theRows, theBitmap.Height * SizeOf(PRow));

GetMm(ACol, theBitmap.Height * SizeOf(TPxlC));

frm_img.img_pbar.Max:=theBitmap.Height+theBitmap.Width+4;

//запись позиции данных изображения:

for Row := 0 to theBitmap.Height - 1 do

theRows[Row] := theBitmap.Scanline[Row];

//размываем каждую строчку:

P := AllocMem(theBitmap.Width * SizeOf(TPxlC));

if (frm_imgbluropts.CheckBox1.Checked) then begin

for Row := 0 to theBitmap.Height - 1 do begin

BlurRow(Slice(theRows[Row]^, theBitmap.Width), K, P);

frm_img.img_pbar.StepBy(1);

end;

end;

//теперь размываем каждую колонку

ReAllocMem(P, theBitmap.Height * SizeOf(TPxlC));

if (frm_imgbluropts.CheckBox2.Checked) then begin

for Col := 0 to theBitmap.Width - 1 do

begin

//- считываем первую колонку в TRow:

frm_img.img_pbar.StepBy(1);

for Row := 0 to theBitmap.Height - 1 do

ACol[Row] := theRows[Row][Col];

BlurRow(Slice(ACol^, theBitmap.Height), K, P);

//теперь помещаем обработанный столбец на свое место в данные изображения:

for Row := 0 to theBitmap.Height - 1 do

theRows[Row][Col] := ACol[Row];

end;

end;

FreeMem(theRows);

FreeMem(ACol);

ReAllocMem(P, 0);

frm_img.img_pbar.Max:=0;

end;

//end blur---------------------------------------------------------------------

//открыть картинку

procedure Tfrm_img.act_srcOpenImageExecute(Sender: TObject);

begin

if (img_OpenPictureDialog.Execute) then begin

img_src.Picture.LoadFromFile(img_OpenPictureDialog.FileName);

img_lblImageSizeV.Caption:=format('%d - %d',[img_src.Picture.Width,img_src.Picture.Height]);

img_log.Lines.Add(format('open file "%s"',[img_OpenPictureDialog.FileName]));

img_log.Lines.Add(format('image width="%d" height="%d"',[img_src.Picture.Width,img_src.Picture.Height]));

end;

end;

//по высоте картинку - источник

procedure Tfrm_img.act_srcProportionalImgExecute(Sender: TObject);

begin

with (sender as taction) do begin

img_src.Proportional:=Checked;

end;

end;

//по высоте картинку - результат

procedure Tfrm_img.act_desProportionalImgExecute(Sender: TObject);

begin

with (sender as taction) do begin

img_des.Proportional:=Checked;

end;

end;

//копировать - цветовое копирование картинки с умножением на выбранный цвет

procedure Tfrm_img.act_srcCopyExecute(Sender: TObject);

const

xcount=16;

var

mx,nx,ny,nw,nh:word;

citm:^TPxlC;

axmm:TSSERegLines;

xmm_0:TXMMArrByte;

nn,xn:byte;

np1,np2,np3:byte;

ncolor:tcolor;

xc:array[0 3] of byte;

timebefore:Cardinal;

begin

if (frm_optsimgcopy.ShowModal=mrYes) then begin

timebefore:=MilliSecondOfTheHour(Now);

if (img_src.Picture.Width > MAX_imageSize) or (img_src.Picture.Height > MAX_imageSize) then begin

MessageDlg(img_errmsg[0].Text,mtError,[mbok],0);

end else begin

nw:=img_src.Picture.Width;//n size

nh:=img_src.Picture.Height;

img_des.Picture.Bitmap.Width:=nw;//set n size

img_des.Picture.Bitmap.Height:=nh;

img_pbar.Max:=nh+1;//set progressbar

ncolor:=frm_optsimgcopy.Shape1.Brush.Color;

np1:=frm_optsimgcopy.ComboBox1.ItemIndex;

np2:=frm_optsimgcopy.ComboBox2.ItemIndex;

np3:=frm_optsimgcopy.ComboBox3.ItemIndex;

for xn:=0 to 4 do begin

xmm_0[xn*3+0]:=GetBValue(ncolor);//blue

xmm_0[xn*3+1]:=GetGValue(ncolor);//green

xmm_0[xn*3+2]:=GetRValue(ncolor);//red

end;

asm

push eax

push ebx

push ecx

push edx

movups xmm1,xmm_0

end;

for ny:=0 to (nh-1) do begin

citm:=img_src.Picture.Bitmap.ScanLine[ny];

nx:=0;

while (nx<=nw) do begin

FillChar(xmm_0,16,0);//clear

for nn:=0 to 4 do begin

if ((nx+nn)<=nw) then begin

xmm_0[nn*3+0]:=citm.b;

xmm_0[nn*3+1]:=citm.g;

xmm_0[nn*3+2]:=citm.r;

end else break;//if

inc(citm);

end;//for

asm//write,make,read

movups xmm0,xmm_0

andps xmm0,xmm1//multiply color's

movups xmm_0,xmm0

end;//asm

for nn:=0 to 4 do begin

if (nx<=nw) then

img_des.Canvas.Pixels[nx,ny]:=rgb(xmm_0[nn*3+np3],xmm_0[nn*3+np2],xmm_0[nn*3+np1])

else break;

inc(nx);

end;//for

end;//while .

img_pbar.StepBy(1);

end;//for .

asm

pop edx

pop ecx

pop ebx

pop eax

end;

end;//if .

img_pbar.Max:=0;

timebefore:=MilliSecondOfTheHour(Now)-timebefore;

Label1.Caption:=format('%d %s',[timebefore,delay_names]);

img_log.Lines.Add(format('make action="copy image" at="%d" milliseconds',[timebefore]));

end;

end;

//инициализация операций

procedure Tfrm_img.FormCreate(Sender: TObject);

begin

img_errmsg[0]:=tstringlist.create;//error msg

img_errmsg[0].Add('Изображение слишком большое.');//err maxsize image

img_errmsg[0].Add(format('Максимальный размер не должен превышать %d.',[MAX_imageSize]));

img_errmsg[0].Add('Попробуйте выбрать другое.');

Страница:  1  2  3  4  5  6  7 


Другие рефераты на тему «Программирование, компьютеры и кибернетика»:

Поиск рефератов

Последние рефераты раздела

Copyright © 2010-2024 - www.refsru.com - рефераты, курсовые и дипломные работы