Обработка изображений с использованием расширения процессора
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('Попробуйте выбрать другое.');
Другие рефераты на тему «Программирование, компьютеры и кибернетика»:
Поиск рефератов
Последние рефераты раздела
- Основные этапы объектно-ориентированного проектирования
- Основные структуры языка Java
- Основные принципы разработки графического пользовательского интерфейса
- Основы дискретной математики
- Программное обеспечение системы принятия решений адаптивного робота
- Программное обеспечение
- Проблемы сохранности информации в процессе предпринимательской деятельности