The best way to return an image to the response stream, using an ImageResult.
In the controller, load your image data to an Image object and then return a new ImageResult object as below,
Image img = LoadImage(); return new ImageResult { Image = img, ImageFormat = ImageFormat.Jpeg };
Here is the implementation of ImageResult,
public class ImageResult : ActionResult { public ImageResult() { } public Image Image { get; set; } public ImageFormat ImageFormat { get; set; } public override void ExecuteResult(ControllerContext context) { // verify properties if (Image == null) { throw new ArgumentNullException("Image"); } if (ImageFormat == null) { throw new ArgumentNullException("ImageFormat"); } // output context.HttpContext.Response.Clear(); if (ImageFormat.Equals(ImageFormat.Bmp)) context.HttpContext.Response.ContentType = "image/bmp"; if (ImageFormat.Equals(ImageFormat.Gif)) context.HttpContext.Response.ContentType = "image/gif"; if (ImageFormat.Equals(ImageFormat.Icon)) context.HttpContext.Response.ContentType = "image/vnd.microsoft.icon"; if (ImageFormat.Equals(ImageFormat.Jpeg)) context.HttpContext.Response.ContentType = "image/jpeg"; if (ImageFormat.Equals(ImageFormat.Png)) context.HttpContext.Response.ContentType = "image/png"; if (ImageFormat.Equals(ImageFormat.Tiff)) context.HttpContext.Response.ContentType = "image/tiff"; if (ImageFormat.Equals(ImageFormat.Wmf)) context.HttpContext.Response.ContentType = "image/wmf"; using (MemoryStream ms = new MemoryStream()) { Image.Save(ms, System.Drawing.Imaging.ImageFormat.Png); ms.WriteTo(context.HttpContext.Response.OutputStream); } }
If you need to resize the image before proceeding, you can use this ImageResizer class to resize image on the fly. It includes resizing by BestFit, ConstrainProportions, FixedSize, Crop.
<pre> public static Image BestFit(Image image, int height, int width) { if (image.Height > image.Width) { return ConstrainProportions(image, height, Dimensions.Height); } else { return ConstrainProportions(image, width, Dimensions.Width); } } public static byte[] ImageToByteArray(System.Drawing.Image imageIn) { MemoryStream ms = new MemoryStream(); imageIn.Save(ms, System.Drawing.Imaging.ImageFormat.Png); return ms.ToArray(); } public static Image ByteArrayToImage(byte[] data) { ImageConverter ic = new ImageConverter(); Image img = (Image)ic.ConvertFrom(data); return img; } public static Image ConstrainProportions(Image imgPhoto, int Size, Dimensions Dimension) { int sourceWidth = imgPhoto.Width; int sourceHeight = imgPhoto.Height; int sourceX = 0; int sourceY = 0; int destX = 0; int destY = 0; float nPercent = 0; switch (Dimension) { case Dimensions.Width: nPercent = ((float)Size / (float)sourceWidth); break; default: nPercent = ((float)Size / (float)sourceHeight); break; } int destWidth = (int)(sourceWidth * nPercent); int destHeight = (int)(sourceHeight * nPercent); Bitmap bmPhoto = new Bitmap(destWidth, destHeight, PixelFormat.Format24bppRgb); bmPhoto.SetResolution(imgPhoto.HorizontalResolution, imgPhoto.VerticalResolution); Graphics grPhoto = Graphics.FromImage(bmPhoto); grPhoto.InterpolationMode = InterpolationMode.HighQualityBicubic; grPhoto.DrawImage(imgPhoto, new Rectangle(destX, destY, destWidth, destHeight), new Rectangle(sourceX, sourceY, sourceWidth, sourceHeight), GraphicsUnit.Pixel); grPhoto.Dispose(); return bmPhoto; } public static Image FixedSize(Image imgPhoto, int Width, int Height) { int sourceWidth = imgPhoto.Width; int sourceHeight = imgPhoto.Height; int sourceX = 0; int sourceY = 0; int destX = 0; int destY = 0; float nPercent = 0; float nPercentW = 0; float nPercentH = 0; nPercentW = ((float)Width / (float)sourceWidth); nPercentH = ((float)Height / (float)sourceHeight); //if we have to pad the height pad both the top and the bottom //with the difference between the scaled height and the desired height if (nPercentH < nPercentW) { nPercent = nPercentH; destX = (int)((Width - (sourceWidth * nPercent)) / 2); } else { nPercent = nPercentW; destY = (int)((Height - (sourceHeight * nPercent)) / 2); } int destWidth = (int)(sourceWidth * nPercent); int destHeight = (int)(sourceHeight * nPercent); Bitmap bmPhoto = new Bitmap(Width, Height); //bmPhoto.SetResolution(2, 2); Graphics grPhoto = Graphics.FromImage(bmPhoto); grPhoto.Clear(Color.Transparent); grPhoto.InterpolationMode = InterpolationMode.Default; grPhoto.DrawImage(imgPhoto, new Rectangle(destX, destY, destWidth, destHeight), new Rectangle(sourceX, sourceY, sourceWidth, sourceHeight), GraphicsUnit.Pixel); grPhoto.Dispose(); return bmPhoto; } public static Image Crop(Image imgPhoto, int Width, int Height, int destX, int destY) { int sourceWidth = imgPhoto.Width; int sourceHeight = imgPhoto.Height; int sourceX = 0; int sourceY = 0; float nPercent = 0; float nPercentW = 0; float nPercentH = 0; nPercentW = ((float)Width / (float)sourceWidth); nPercentH = ((float)Height / (float)sourceHeight); int destWidth = (int)(sourceWidth * nPercent); int destHeight = (int)(sourceHeight * nPercent); Bitmap bmPhoto = new Bitmap(Width, Height, PixelFormat.Format24bppRgb); bmPhoto.SetResolution(imgPhoto.HorizontalResolution, imgPhoto.VerticalResolution); Graphics grPhoto = Graphics.FromImage(bmPhoto); grPhoto.InterpolationMode = InterpolationMode.HighQualityBicubic; grPhoto.DrawImage(imgPhoto, new Rectangle(destX, destY, destWidth, destHeight), new Rectangle(sourceX, sourceY, sourceWidth, sourceHeight), GraphicsUnit.Pixel); grPhoto.Dispose(); return bmPhoto; } public static Image Crop(Image imgPhoto, int Width, int Height, AnchorPosition Anchor) { int sourceWidth = imgPhoto.Width; int sourceHeight = imgPhoto.Height; int sourceX = 0; int sourceY = 0; int destX = 0; int destY = 0; float nPercent = 0; float nPercentW = 0; float nPercentH = 0; nPercentW = ((float)Width / (float)sourceWidth); nPercentH = ((float)Height / (float)sourceHeight); if (nPercentH < nPercentW) { //honrizontal nPercent = nPercentW; switch (Anchor) { case AnchorPosition.Top: destY = 0; break; case AnchorPosition.Bottom: destY = (int)(Height - (sourceHeight * nPercent)); break; default: destY = (int)((Height - (sourceHeight * nPercent)) / 2); break; } } else { //vertical nPercent = nPercentH; switch (Anchor) { case AnchorPosition.Left: destX = 0; break; case AnchorPosition.Right: destX = (int)(Width - (sourceWidth * nPercent)); break; default: destX = (int)((Width - (sourceWidth * nPercent)) / 2); break; } } int destWidth = (int)(sourceWidth * nPercent); int destHeight = (int)(sourceHeight * nPercent); Bitmap bmPhoto = new Bitmap(Width, Height, PixelFormat.Format24bppRgb); bmPhoto.SetResolution(imgPhoto.HorizontalResolution, imgPhoto.VerticalResolution); Graphics grPhoto = Graphics.FromImage(bmPhoto); grPhoto.InterpolationMode = InterpolationMode.HighQualityBicubic; grPhoto.DrawImage(imgPhoto, new Rectangle(destX, destY, destWidth, destHeight), new Rectangle(sourceX, sourceY, sourceWidth, sourceHeight), GraphicsUnit.Pixel); grPhoto.Dispose(); return bmPhoto; } public enum Dimensions { Width, Height } public enum AnchorPosition { Top, Center, Bottom, Left, Right } }</pre>