Уроки - Как сделать размытие картинки(Blur)

Поставь на форму картинку, которая должна быть размыта (TImage). Размытие этой картинки 
осуществляется по следующемы принципу. Цвет каждой точки картинки меняется в 
соответствии с уветом ее ближайших соседних точек.

Добавляешь модули: Uses jpeg, math; Добавляешь после модулей: type TRGBArray = ARRAY[
0..32767] OF TRGBTriple; pRGBArray = ^TRGBArray; Добавляешь в private: InFileName : String; Добавляешь в public: OriginalBMP : TBitmap; procedure CopyMe(tobmp: TBitmap; frbmp : TGraphic); procedure ConvolveM(ray : array of integer; z : word; aBmp : TBitmap); Добавляешь в глобальные переменные: ray : array [0..8] of integer; z : integer; Добавляешь процедуры и функции: function Set255(Clr : integer) : integer; asm MOV EAX,Clr CMP EAX,254 JG @SETHI CMP EAX,1 JL @SETLO RET @SETHI: MOV EAX,255 RET @SETLO: MOV EAX,02; tBufr.Height:=aBmp.Height+2; tBufr.PixelFormat := pf24bit; O := tBufr.ScanLine[0]; T := aBmp.ScanLine[0]; O[0] := T[0]; O[tBufr.Width - 1] := T[aBmp.Width - 1]; tBufr.Canvas.CopyRect(RECT(1,0,tBufr.Width - 1,1),aBmp.Canvas, RECT(0,aBmp.Height - 1,aBmp.Width,aBmp.Height-2)); O := tBufr.ScanLine[tBufr.Height - 1]; T := aBmp.ScanLine[aBmp.Height - 1]; O[0] := T[0]; O[tBufr.Width - 1] := T[aBmp.Width - 1]; tBufr.Canvas.CopyRect(RECT(1,tBufr.Height-1,tBufr.Width - 1,tBufr.Height), aBmp.Canvas,RECT(0,0,aBmp.Width,1)); tBufr.Canvas.CopyRect(RECT(tBufr.Width-1,1,tBufr.Width,tBufr.Height-1), aBmp.Canvas,RECT(0,0,1,aBmp.Height)); tBufr.Canvas.CopyRect(RECT(0,1,1,tBufr.Height-1), aBmp.Canvas,RECT(aBmp.Width - 1,0,aBmp.Width,aBmp.Height)); tBufr.Canvas.CopyRect(RECT(1,1,tBufr.Width - 1,tBufr.Height - 1), aBmp.Canvas,RECT(0,0,aBmp.Width,aBmp.Height)); for x := 0 to aBmp.Height - 1 do begin O := aBmp.ScanLine[x]; T := tBufr.ScanLine[x]; C := tBufr.ScanLine[x+1]; B := tBufr.ScanLine[x+2]; for y := 1 to (tBufr.Width - 2) do begin O[y-1].rgbtRed := Set255( ((T[y-1].rgbtRed*ray[0]) + (T[y].rgbtRed*ray[1]) + (T[y+1].rgbtRed*ray[2]) + (C[y-1].rgbtRed*ray[3]) + (C[y].rgbtRed*ray[4]) + (C[y+1].rgbtRed*ray[5])+ (B[y-1].rgbtRed*ray[6]) + (B[y].rgbtRed*ray[7]) + (B[y+1].rgbtRed*ray[8])) div z ); O[y-1].rgbtBlue := Set255( ((T[y-1].rgbtBlue*ray[0]) + (T[y].rgbtBlue*ray[1]) + (T[y+1].rgbtBlue*ray[2]) + (C[y-1].rgbtBlue*ray[3]) + (C[y].rgbtBlue*ray[4]) + (C[y+1].rgbtBlue*ray[5])+ (B[y-1].rgbtBlue*ray[6]) + (B[y].rgbtBlue*ray[7]) + (B[y+1].rgbtBlue*ray[8])) div z ); O[y-1].rgbtGreen := Set255( ((T[y-1].rgbtGreen*ray[0]) + (T[y].rgbtGreen*ray[1]) + (T[y+1].rgbtGreen*ray[2]) + (C[y-1].rgbtGreen*ray[3]) + (C[y].rgbtGreen*ray[4]) + (C[y+1].rgbtGreen*ray[5])+ (B[y-1].rgbtGreen*ray[6]) + (B[y].rgbtGreen*ray[7]) + (B[y+1].rgbtGreen*ray[8])) div z ); end; end; tBufr.Free; end; procedure TForm1.FormCreate(Sender: TObject); begin OriginalBMP := TBitmap.Create; // Создаем bitmap end; procedure TForm1.CopyMe(tobmp: TBitmap; frbmp : TGraphic); begin tobmp.Width := frbmp.Width; tobmp.Height := frbmp.Height; tobmp.PixelFormat := pf24bit; tobmp.Canvas.Draw(0,0,frbmp); end; {Кнопка запуска размытия} procedure TForm1.Button1Click(Sender: TObject); var ray : array [0..8] of integer; OrigBMP : TBitmap; begin begin // Размытие CopyMe(OriginalBMP,Image1.Picture.Graphic); ray[0] := 3; ray[1] := 3; ray[2] := 3; ray[3] := 3; ray[4] := 8; ray[5] := 3; ray[6] := 3; ray[7] := 3; ray[8] := 3; z := 32; end; Image1.Picture.Assign(OriginalBMP); OrigBMP := TBitmap.Create; // Конвертируем в 24-bit bitmap CopyMe(OrigBMP,Image1.Picture.Graphic); if z = 0 then z := 1; ConvolveM(ray,z,OrigBMP); Image1.Picture.Assign(OrigBMP); OrigBMP.Free; Image1.Refresh; end; В данном случае формула размытия выглядит так: 333 383 333 Проэкспериментируй меняя значения.
Сайт управляется системой uCoz