public static (Point TopLeft, Point BottomRight) FindImageBounds([NotNull] Bitmap value, Color backColor, DimensionRestriction restriction = DimensionRestriction.None, int unitWidthLimit = 0, int unitHeightLimit = 0) { if (value.Width < 2 || value.Height < 2) { return(Point.Empty, Point.Empty); } int width = value.Width, height = value.Height; Point topLeft = new Point(); Point bottomRight = new Point(width, height); unitWidthLimit = unitWidthLimit.Within(0, width); unitHeightLimit = unitHeightLimit.Within(0, height); if (unitWidthLimit == width) { restriction |= DimensionRestriction.KeepWidth; } if (unitHeightLimit == height) { restriction |= DimensionRestriction.KeepHeight; } bool kw = restriction.FastHasFlag(DimensionRestriction.KeepWidth); bool kh = restriction.FastHasFlag(DimensionRestriction.KeepHeight); if (kw && kh) { return(topLeft, bottomRight); } bool kuw = unitWidthLimit > 0; bool kuh = unitHeightLimit > 0; bool found = false; if (!kuw || !kuh) { for (int y = 0; y < height && !found; y++) { for (int x = 0; x < width && !found; x++) { Color c = value.GetPixel(x + 1, y + 1); if (c.IsSame(backColor)) { continue; } if (!kw && !kuw) { topLeft.X = x; } if (!kh && !kuh) { topLeft.Y = y; } found = true; } } found = false; } for (int y = height; y > 0 && !found; y--) { for (int x = width; x > 0 && !found; x--) { Color c = value.GetPixel(x - 1, y - 1); if (c.IsSame(backColor)) { continue; } if (!kw) { bottomRight.X = x; } if (!kh) { bottomRight.Y = y; } found = true; } } if (kuw && !kw) { bottomRight.X = bottomRight.X.Multiplier(unitWidthLimit); } if (kuh && !kh) { bottomRight.Y = bottomRight.Y.Multiplier(unitHeightLimit); } return(topLeft, bottomRight); }
public static Bitmap Crop([NotNull] Bitmap value, Rectangle rectangle, DimensionRestriction restriction = DimensionRestriction.None) { // Check source format if (!__formatTranslations.TryGetValue(value.PixelFormat, out PixelFormat formatTranslation)) { throw new UnsupportedImageFormatException(); } if (value.Width == 0 || value.Height == 0 || rectangle.IsEmpty) { return(null); } int width = value.Width, height = value.Height; if (restriction.FastHasFlag(DimensionRestriction.KeepWidth)) { rectangle.X = 0; rectangle.Width = width; } if (restriction.FastHasFlag(DimensionRestriction.KeepHeight)) { rectangle.Y = 0; rectangle.Height = height; } if (rectangle.IsEmpty || rectangle.Width <= 0 || rectangle.Height <= 0) { return(null); } if (rectangle.X == 0 && rectangle.Y == 0 && rectangle.Width == width && rectangle.Height == height) { return(Clone(value)); } if (rectangle.X + rectangle.Width > width) { rectangle.Width = width - rectangle.X; } if (rectangle.Y + rectangle.Height > height) { rectangle.Height = height - rectangle.Y; } BitmapData imageData = value.LockBits(new Rectangle(0, 0, value.Width, value.Height), ImageLockMode.ReadOnly, value.PixelFormat); Bitmap bitmap; try { Size newImageSize = rectangle.Size; bitmap = formatTranslation == PixelFormat.Format8bppIndexed ? CreateGreyscaleImage(newImageSize.Width, newImageSize.Height) : new Bitmap(newImageSize.Width, newImageSize.Height, formatTranslation); BitmapData bitmapData = bitmap.LockBits(new Rectangle(0, 0, newImageSize.Width, newImageSize.Height), ImageLockMode.ReadWrite, formatTranslation); try { // Process filter Crop(new UnmanagedImage(imageData), new UnmanagedImage(bitmapData), rectangle); } finally { bitmap.UnlockBits(bitmapData); } if (value.HorizontalResolution > 0.0) { if (value.VerticalResolution > 0.0) { bitmap.SetResolution(value.HorizontalResolution, value.VerticalResolution); } } } finally { value.UnlockBits(imageData); } return(bitmap); }