Cut center image

Suppose I have a 400x300px image, and I would like to cut it as 200x200px, centering it, on the server side (C #, .NET 4.0).

How can i do this? Use some kind of canvas and move it? Any tutorial / sample code / suggestion?

+3
source share
3 answers

Try something like this:

Bitmap sourceImage = ...; int targetWidth = 200; int targetHeight = 200; int x = sourceImage.Width / 2 - targetWidth / 2; int y = sourceImage.Height / 2 - targetHeight / 2; Rectangle cropArea = new Rectangle(x, y, targetWidth, targetHeight); Bitmap targetImage = sourceImage.Clone(cropArea, sourceImage.PixelFormat); 

If the original image is smaller than the size of the target image, this obviously will not succeed, but you get the idea.

+5
source

This method will save the image cropped in the center, if necessary:

 bool SaveCroppedImage(Image image, int targetWidth, int targetHeight, string filePath) { ImageCodecInfo jpgInfo = ImageCodecInfo.GetImageEncoders().Where(codecInfo => codecInfo.MimeType == "image/jpeg").First(); Image finalImage = image; System.Drawing.Bitmap bitmap = null; try { int left = 0; int top = 0; int srcWidth = targetWidth; int srcHeight = targetHeight; bitmap = new System.Drawing.Bitmap(targetWidth, targetHeight); double croppedHeightToWidth = (double)targetHeight / targetWidth; double croppedWidthToHeight = (double)targetWidth / targetHeight; if (image.Width > image.Height) { srcWidth = (int)(Math.Round(image.Height * croppedWidthToHeight)); if (srcWidth < image.Width) { srcHeight = image.Height; left = (image.Width - srcWidth) / 2; } else { srcHeight = (int)Math.Round(image.Height * ((double)image.Width / srcWidth)); srcWidth = image.Width; top = (image.Height - srcHeight) / 2; } } else { srcHeight = (int)(Math.Round(image.Width * croppedHeightToWidth)); if (srcHeight < image.Height) { srcWidth = image.Width; top = (image.Height - srcHeight) / 2; } else { srcWidth = (int)Math.Round(image.Width * ((double)image.Height / srcHeight)); srcHeight = image.Height; left = (image.Width - srcWidth) / 2; } } using (Graphics g = Graphics.FromImage(bitmap)) { g.SmoothingMode = SmoothingMode.HighQuality; g.PixelOffsetMode = PixelOffsetMode.HighQuality; g.CompositingQuality = CompositingQuality.HighQuality; g.InterpolationMode = InterpolationMode.HighQualityBicubic; g.DrawImage(image, new Rectangle(0, 0, bitmap.Width, bitmap.Height), new Rectangle(left, top, srcWidth, srcHeight), GraphicsUnit.Pixel); } finalImage = bitmap; } catch { } try { using (EncoderParameters encParams = new EncoderParameters(1)) { encParams.Param[0] = new EncoderParameter(Encoder.Quality, (long)100); //quality should be in the range [0..100] .. 100 for max, 0 for min (0 best compression) finalImage.Save(filePath, jpgInfo, encParams); return true; } } catch { } if (bitmap != null) { bitmap.Dispose(); } return false; } 
+1
source

Create a new Bitmap object with a destination size.

Create a Graphics object around this bitmap.

In this Graphcs object, call DrawImage () with the appropriate parameters and cut the correct segment from the first image.

The code will look something like this:

 Bitmap dstBitmap=new Bitmap(200, 200); using (Graphics g=Graphics.FromImage(dstBitmap)) { srcBitmap.DrawImage(dstBitmap, /* cropping parameters here */); } // at the end you'll have your bitmap in dstBitmap, ... 

I did not include literal parameters for methods, use intellisense and a guide to figure them out.

-1
source

All Articles