Exemple #1
0
        public Rectangle ContentBound(Bitmap src, RefColorMode mode = RefColorMode.Alpha)
        {
            Rectangle result = new Rectangle(0, 0, src.Width, src.Height);

            LockBitmap lockbmp = new LockBitmap(src);

            //锁定Bitmap,通过Pixel访问颜色
            lockbmp.LockBits();
            #region Get Ref Color value
            Color cRef = lockbmp.GetPixel(0, 0);
            switch (mode)
            {
            case RefColorMode.Alpha:
                cRef = Color.Transparent;
                break;

            case RefColorMode.TopLeft:
                cRef = lockbmp.GetPixel(0, 0);
                break;

            case RefColorMode.BottomRight:
                cRef = lockbmp.GetPixel(lockbmp.Width - 1, lockbmp.Height - 1);
                break;
            }
            #endregion

            #region Check pixels value with Ref Value
            int xMin = 0;
            int xMax = lockbmp.Width - 1;
            int yMin = 0;
            int yMax = lockbmp.Height - 1;
            var w    = lockbmp.Width - 1;
            var h    = lockbmp.Height - 1;
            var hh   = (int)Math.Ceiling(lockbmp.Height / 2.0f) + 1;
            var wh   = (int)Math.Ceiling(lockbmp.Width / 2.0f) + 1;

            #region Get Bound Top & Bottom
            for (var y = 0; y < hh; y++)
            {
                for (var x = 0; x < w + 1; x++)
                {
                    var yc = h - y;

                    Color ct = lockbmp.GetPixel(x, y);
                    Color cb = lockbmp.GetPixel(x, yc);
                    switch (mode)
                    {
                    case RefColorMode.Alpha:
                        if (ct.A != cRef.A)
                        {
                            if (yMin == 0)
                            {
                                yMin = y - 1;
                            }
                        }
                        if (cb.A != cRef.A)
                        {
                            if (yMax == h)
                            {
                                yMax = yc + 1;
                            }
                        }
                        break;

                    default:
                        if (ct.A != cRef.A || ct.R != cRef.R || ct.G != cRef.G || ct.B != cRef.B)
                        {
                            if (yMin == 0)
                            {
                                yMin = y - 1;
                            }
                        }
                        if (cb.A != cRef.A || cb.R != cRef.R || cb.G != cRef.G || cb.B != cRef.B)
                        {
                            if (yMax == h)
                            {
                                yMax = yc + 1;
                            }
                        }
                        break;
                    }
                    if (yMin != 0 && yMax != h)
                    {
                        break;
                    }
                }
                if (yMin != 0 && yMax != h)
                {
                    break;
                }
            }
            #endregion

            #region Get Bound Left & Right
            for (var x = 0; x < wh; x++)
            {
                for (var y = yMin + 1; y < yMax; y++)
                {
                    var xc = w - x;

                    Color cl = lockbmp.GetPixel(x, y);
                    Color cr = lockbmp.GetPixel(xc, y);
                    switch (mode)
                    {
                    case RefColorMode.Alpha:
                        if (cl.A != cRef.A)
                        {
                            if (xMin == 0)
                            {
                                xMin = x - 1;
                            }
                        }
                        if (cr.A != cRef.A)
                        {
                            if (xMax == w)
                            {
                                xMax = xc + 1;
                            }
                        }
                        break;

                    default:
                        if (cl.A != cRef.A || cl.R != cRef.R || cl.G != cRef.G || cl.B != cRef.B)
                        {
                            if (xMin == 0)
                            {
                                xMin = x - 1;
                            }
                        }
                        if (cr.A != cRef.A || cr.R != cRef.R || cr.G != cRef.G || cr.B != cRef.B)
                        {
                            if (xMax == w)
                            {
                                xMax = xc + 1;
                            }
                        }
                        break;
                    }
                    if (xMin != 0 && xMax != w)
                    {
                        break;
                    }
                }
                if (xMin != 0 && xMax != w)
                {
                    break;
                }
            }
            #endregion

            #endregion

            //从内存解锁Bitmap
            lockbmp.UnlockBits();

            #region adjust bound size
            xMin          = xMin < 0 ? 0 : xMin;
            xMax          = xMax >= src.Width ? src.Width - 1 : xMax;
            yMin          = yMin < 0 ? 0 : yMin;
            yMax          = yMax >= src.Height ? src.Height - 1 : yMax;
            result.X      = xMin;
            result.Y      = yMin;
            result.Width  = (xMax - xMin) < 0 ? src.Width : xMax - xMin;
            result.Height = (yMax - yMin) < 0 ? src.Height : yMax - yMin;
            #endregion

            return(result);
        }
 private void refColorModeComboBox_SelectedIndexChanged(object sender, EventArgs e)
 {
     refColorMode = (RefColorMode)refColorModeComboBox.SelectedIndex;
 }
 private void refColorModeComboBox_SelectedIndexChanged(object sender, EventArgs e)
 {
     refColorMode = (RefColorMode)refColorModeComboBox.SelectedIndex;
 }