Exemplo n.º 1
0
        public static bool ImageToBackBone(Bitmap b)
        {
            // GDI+ still lies to us - the return format is BGR, NOT RGB.
            BitmapData bmData = b.LockBits(new Rectangle(0, 0, b.Width, b.Height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);

            int stride = bmData.Stride;

            System.IntPtr Scan0 = bmData.Scan0;

            int[][] mr = new int[b.Width][];
            int[][] fr = new int[b.Height][];
            unsafe
            {
                byte *p = (byte *)(void *)Scan0;

                int nOffset = stride - b.Width * 3;

                byte red, green, blue;
                for (int x = 0; x < b.Width; ++x)
                {
                    mr[x] = new int[b.Height];
                }
                for (int y = 0; y < b.Height; ++y)
                {
                    fr[y] = new int[b.Width];
                    for (int x = 0; x < b.Width; ++x)
                    {
                        blue  = p[0];
                        green = p[1];
                        red   = p[2];
                        if (blue == 255 && green == 255 && red == 255)
                        {
                            mr[x][y] = 1;
                            fr[y][x] = 1;
                        }
                        p += 3;
                    }
                    p += nOffset;
                }
                FontMethods.Converge(mr, 5);
                FontMethods.Converge(fr, 5);
            }

            unsafe
            {
                byte *p = (byte *)(void *)Scan0;

                int nOffset = stride - b.Width * 3;

                byte red, green, blue;
                for (int y = 0; y < b.Height; ++y)
                {
                    for (int x = 0; x < b.Width; ++x)
                    {
                        blue  = p[0];
                        green = p[1];
                        red   = p[2];
                        if (blue == 255 && green == 255 && red == 255)
                        {
                            if (mr[x][y] == 0)
                            {
                                p[0] = p[1] = p[2] = 0;
                            }
                            if (fr[y][x] == 0)
                            {
                                p[0] = p[1] = p[2] = 0;
                            }
                        }
                        p += 3;
                    }
                    p += nOffset;
                }
            }

            b.UnlockBits(bmData);

            _ImageToBackBone(b, mr, fr);

            return(true);
        }