What is the fastest and more reliable way of generating thumbnails in .NET? I need to get any image, compress it in JPEG and resize it.
I\'ve seen several examples w
I use ImageMagick for photo processing
UPDATED
Model:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.IO;
using ImageMagickObject;
namespace photostorage.Models
{
public class PhotoProcessing
{
public MagickImage ResizeImg(string filepath, string filename)
{
Object[] rotate = new Object[] { filepath + "/" + filename,
"-auto-orient", filepath + "/" + filename };
Object[] big = new Object[] { filepath + "/" + filename,
"-resize", "800", filepath + "/" + "big_" + filename };
Object[] middle = new Object[] { filepath + "/big_" + filename,
"-resize", "400", filepath + "/" + "mid_" + filename };
Object[] small = new Object[] { filepath + "/mid_" + filename,
"-resize", "200", filepath + "/" + "small_" + filename };
Object[] crop = new Object[] { filepath + "/small_" + filename,
"-resize", "50", filepath + "/" + "crop_" + filename };
ImageMagickObject.MagickImage img =
new ImageMagickObject.MagickImage();
img.Convert(rotate);
img.Convert(big);
img.Convert(middle);
img.Convert(small);
img.Convert(crop);
return img;
}
}
}
Controller:
PhotoProcessing resizeImg = new PhotoProcessing();
[HttpPost]
public string Index(params,params,params...)
{
var GetResize = resizeImg.ResizeImg(
destinationFolder + "/" + curFolder, fullFileName);
}
I am using Aurigma Image Uploader tool. it's pretty nice control. but it is paid you can check aurigma
I can't say whether this is the most efficient manner, but here is a snippet of code I wrote to produce 3 smaller images from a large image:
private void GenerateImages(byte[] data, string extension, string filename)
{
// Assuming data is the original filename.
var ms = new MemoryStream(data);
var image = Image.FromStream(ms);
image.Save(filename);
ResizeImage(image, 800, 600, "large.jpg");
ResizeImage(image, 480, 320, "medium.jpg");
ResizeImage(image, 192, 144, "small.jpg");
}
private void ResizeImage(Image image, int width, int height, string filename)
{
using (var newImage = new Bitmap(width, height))
{
var graphics = Graphics.FromImage(newImage);
graphics.DrawImage(image, 0, 0, width, height);
newImage.Save(filename, ImageFormat.Jpeg);
}
}
For intensive server-side code, I suggest you use other techniques than GDI+ that has not been designed to handle images chunk by chunk (in a streaming manner).
You can use Windows Imaging Component or WPF for this task. There is a very good example on how to do this in a fast and - more important - scalable manner here:
The fastest way to resize images from ASP.NET. And it’s (more) supported-ish.
See my answer here Create thumbnail image
There is a function on Image which returns a thumbnail like this:
Image image = Image.FromFile(fileName);
Image thumb = image.GetThumbnailImage(120, 120, ()=>false, IntPtr.Zero);
thumb.Save(Path.ChangeExtension(fileName, "thumb"));
This has done me fine for years:
public static void CreateThumbnail(string filename, int desiredWidth, int desiredHeight, string outFilename)
{
using (System.Drawing.Image img = System.Drawing.Image.FromFile(filename))
{
float widthRatio = (float)img.Width / (float)desiredWidth;
float heightRatio = (float)img.Height / (float)desiredHeight;
// Resize to the greatest ratio
float ratio = heightRatio > widthRatio ? heightRatio : widthRatio;
int newWidth = Convert.ToInt32(Math.Floor((float)img.Width / ratio));
int newHeight = Convert.ToInt32(Math.Floor((float)img.Height / ratio));
using (System.Drawing.Image thumb = img.GetThumbnailImage(newWidth, newHeight, new System.Drawing.Image.GetThumbnailImageAbort(ThumbnailImageAbortCallback), IntPtr.Zero))
{
thumb.Save(outFilename, System.Drawing.Imaging.ImageFormat.Jpeg);
}
}
}
public static bool ThumbnailImageAbortCallback()
{
return true;
}