Bitmap^ AplicarMascara2(System::Drawing::Bitmap ^Imagen, cli::array<int>^ Mascara, int Tamanio){
this->ImagenFiltrada=gcnew System::Drawing::Bitmap (Imagen);
int i, j, k, q, IncX, IncY, X, Y, ValorPixel, PosVectorRGB;
int TamanioNxN=Tamanio*Tamanio;
double Sumatorio;
Color color;
int Cte1=Tamanio/2;
// formato de pixel
PixelFormat pxf = PixelFormat::Format24bppRgb;
// Bloqueamos los pixels de la imagen original y la filtrada
Rectangle rect = System::Drawing::Rectangle(0, 0, Imagen->Width, Imagen->Height);
BitmapData ^bmpDatosOriginal = Imagen->LockBits(rect, ImageLockMode::ReadWrite, pxf);
BitmapData ^bmpDatosFiltrada = ImagenFiltrada->LockBits(rect, ImageLockMode::ReadWrite, pxf);
// Obtenemos la direcciones de comienzo
IntPtr ptrOriginal = bmpDatosOriginal->Scan0;
IntPtr ptrFiltrada = bmpDatosFiltrada->Scan0;
// Declaramos los arrays para almacenar los bytes de los bitmaps
int numBytes = Imagen->Width * Imagen->Height * 3;
array<Byte> ^valoresRGBOriginal = gcnew array<Byte>(numBytes);
array<Byte> ^valoresRGBFiltrada = gcnew array<Byte>(numBytes);
// Copiamos los valores RGB a los arrays
Marshal::Copy(ptrOriginal, valoresRGBOriginal, 0, numBytes);
Marshal::Copy(ptrFiltrada, valoresRGBFiltrada, 0, numBytes);
// Recorremos la imagen
for(i=0; i<Imagen->Width; i++){
for (j=0; j<Imagen->Height; j++){
IncY=Cte1;
Sumatorio=0;
// Recorremos la máscara
for (k=0; k<Tamanio; k++){
Y=j+IncY;
IncX=Cte1;
for (q=0; q<Tamanio; q++){
X=i+IncX;
if ((X>=0&&X<Imagen->Width)&&(Y>=0&&Y<Imagen->Height)){
Sumatorio=Sumatorio+
Convert::ToDouble(Mascara[(Cte1+IncX)*3 + (Cte1+IncY)])*
Convert::ToDouble(valoresRGBOriginal[(Y*Imagen->Width+X)*3]);
}
IncX--;
}
IncY--;
}
// El valor del pixel será el valor del sumatorio obtenido
if (Sumatorio>0)ValorPixel=Convert::ToInt32(Sumatorio)%255;
else ValorPixel=0;
PosVectorRGB=(j*Imagen->Width+i)*3;
valoresRGBFiltrada[PosVectorRGB]=ValorPixel;
valoresRGBFiltrada[PosVectorRGB+1]=ValorPixel;
valoresRGBFiltrada[PosVectorRGB+2]=ValorPixel;
}
}
// Copiamos de nuevo los valores del array al bitmap
Marshal::Copy(valoresRGBFiltrada, 0, ptrFiltrada, numBytes);
// Desbloqueamos los bytes
ImagenFiltrada->UnlockBits(bmpDatosFiltrada);
Imagen->UnlockBits(bmpDatosOriginal);
return ImagenFiltrada;
}