public static void CambiarPixel(this Bitmap bmp, IList <KeyValuePair <Color, Color> > colorsKeyValue) { MetodoColor metodo = (colorValue, colorKey) => { return(colorValue); }; ICambiaPixel(bmp, colorsKeyValue, metodo); }
static void ICambiaPixel(Bitmap bmp, IEnumerable<KeyValuePair<Color, Color>> colorsKeyValue, MetodoColor metodo) { const int TOTALBYTESCOLOR = 4; DiccionarioColor2 diccionario = new DiccionarioColor2(colorsKeyValue); byte[] colorLeido; byte[] colorObtenido; const byte AOPACA = 0xFF; int incremento = bmp.IsArgb() ? 4 : 3; unsafe { bmp.TrataBytes(((MetodoTratarBytePointer)((ptrBytesBmp) => { byte* ptColorLeido, ptColorObtenido; byte* ptBytesBmp = ptrBytesBmp; for (int i = 0, iFin = bmp.LengthBytes(); i < iFin; i += incremento) { colorLeido = new byte[4]; fixed (byte* ptrColorLeido = colorLeido) { ptColorLeido = ptrColorLeido; if (incremento == TOTALBYTESCOLOR) { *ptColorLeido = *ptBytesBmp; ptBytesBmp++; } else { *ptColorLeido = AOPACA; } ptColorLeido++; for (int j = 1; j < incremento; j++) { *ptColorLeido = *ptBytesBmp; ptBytesBmp++; ptColorLeido++; } ptBytesBmp -= incremento;//vuelvo a poner el puntero al principio del color para sobreescribirlo con el nuevo } colorObtenido = metodo(diccionario.ObtenerPrimero(colorLeido), colorLeido); if (colorObtenido != null) { fixed (byte* ptrColorObtenido = colorObtenido) { ptColorObtenido = ptrColorObtenido; for (int j = 0; j < incremento; j++) { *ptBytesBmp = *ptColorObtenido; ptBytesBmp++; ptColorObtenido++; } } } } }))); } }
static void ICambiaPixel(Bitmap bmp, IList <KeyValuePair <Color, Color> > colorsKeyValue, MetodoColor metodo) { const byte AOPACA = 0xFF; const int TOTALBYTESCOLOR = 4; DiccionarioColor2 diccionario = new DiccionarioColor2(colorsKeyValue); byte[] colorLeido; byte[] colorObtenido; int incremento = bmp.IsArgb() ? 4 : 3; unsafe { bmp.TrataBytes(((MetodoTratarUnmanagedTypePointer <byte>)((ptrBytesBmp) => { byte *ptColorLeido, ptColorObtenido; byte *ptBytesBmp = ptrBytesBmp; for (int i = 0, iFin = bmp.LengthBytes(); i < iFin; i += incremento) { colorLeido = new byte[4]; fixed(byte *ptrColorLeido = colorLeido) { ptColorLeido = ptrColorLeido; if (incremento == TOTALBYTESCOLOR) { *ptColorLeido = *ptBytesBmp; ptBytesBmp++; } else { *ptColorLeido = AOPACA; } ptColorLeido++; for (int j = 1; j < incremento; j++) { *ptColorLeido = *ptBytesBmp; ptBytesBmp++; ptColorLeido++; } ptBytesBmp -= incremento;//vuelvo a poner el puntero al principio del color para sobreescribirlo con el nuevo } colorObtenido = metodo(diccionario.ObtenerPrimero(colorLeido), colorLeido); if (colorObtenido != null) { fixed(byte *ptrColorObtenido = colorObtenido) { ptColorObtenido = ptrColorObtenido; for (int j = 0; j < incremento; j++) { *ptBytesBmp = *ptColorObtenido; ptBytesBmp++; ptColorObtenido++; } } } } }))); } }