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; }