Help with image-resizing methods gdi
So I'm in need of some resizing.
I found two different methods.
One looks like this:
public static Byte[] ResizeImageNew(System.Drawing.Image imageFile, int targetWidth, int targetHeight) {
using(imageFile){
开发者_StackOverflow Size newSize = CalculateDimensions(imageFile.Size, targetWidth, targetHeight);
using (Bitmap newImage = new Bitmap(newSize.Width, newSize.Height, PixelFormat.Format32bppRgb)) {
newImage.SetResolution(imageFile.HorizontalResolution, imageFile.VerticalResolution);
using (Graphics canvas = Graphics.FromImage(newImage)) {
canvas.SmoothingMode = SmoothingMode.AntiAlias;
canvas.InterpolationMode = InterpolationMode.HighQualityBicubic;
canvas.PixelOffsetMode = PixelOffsetMode.HighQuality;
canvas.DrawImage(imageFile, new Rectangle(new Point(0, 0), newSize));
MemoryStream m = new MemoryStream();
newImage.Save(m, ImageFormat.Jpeg);
return m.GetBuffer();
}
}
}
}
And the other:
public static System.Drawing.Image ResizeImage(System.Drawing.Image originalImage, int width, int maxHeight) {
originalImage.RotateFlip(System.Drawing.RotateFlipType.Rotate180FlipNone);
originalImage.RotateFlip(System.Drawing.RotateFlipType.Rotate180FlipNone);
int NewHeight = originalImage.Height * width / originalImage.Width;
if (NewHeight > maxHeight) {
// Resize with height instead
width = originalImage.Width * maxHeight / originalImage.Height;
NewHeight = maxHeight;
}
System.Drawing.Image newImage = originalImage.GetThumbnailImage(width, NewHeight, null, IntPtr.Zero);
return newImage;
}
I basically 'borrowed' both methods, and just changed bits and pieces.
However - using the first one, whenever I resize to a little smaller picture, the size of the file is actually larger then the original (!?)
And the second while greatly improving size looks terrible :/
I'm of course leaning on merely improving image quality in the first method, if possible, but I can't see how, everything looks to be 'high quality' from my point of view ?
You may have to set the JPEG compression level. Currently it probably saves at a very high quality level, which may not be what you desire.
See here for more info: http://msdn.microsoft.com/en-us/library/bb882583.aspx
Note, however, that just reducing the resolution of the image doesn't necessarily reduce filesize. Due to how compression works, a smaller resolution file that has been blurred due to interpolation modes can be significantly larger than the original, though with JPEG that's probably not a big concern due to the lossy algorithm. It can make a huge difference for PNGs, though, if the original file was very simple before (like "flat" webcomic or simple vector graphics) and has been blurred after resizing.
Regardless of the file size issues, I would definitely recommend using the first method, rather than the one with the GetThumbnailImage
.
GetThumbnailImage
will actually pull an embedded thumbnail out of the source image if one exists. Unfortunately, this means you're scaling from some unknown original file size and quality (compared to the original) if you're not anticipating and taking into account the embedded thumbnail. It also means that you'll get very different quality results on one run (with an embedded thumbnail) than you would on another run (with no embedded thumbnail).
I've used something similar to your first method numerous times and while I have seen what you're seeing on occasion, the results were just consistently better.
精彩评论