示例#1
0
        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++;
                                }


                            }
                        }

                    }
                })));
            }
        }
示例#3
0
        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++;
                                }
                            }
                        }
                    }
                })));
            }
        }