Ketika membuat sebuah galeri foto, sering kali harus membuat beberapa versi ukuran foto. Foto-foto kecil ditampilkan secara berjajar. Ketika foto diklik, akan muncul foto dengan ukuran besar. Pada waktu slide-show, maka foto ukuran sedang yang ditampilkan. Untuk membuat foto dengan ukuran yang bermacam-macam dapat dilakukan dengan merubah ukuran secara run-time.
Berikut adalah class untuk melakukan resize ukuran image.
public class PhotoManager {
public static byte[] ResizeImageFile(byte[] imageFile, int targetSize) {
using (System.Drawing.Image oldImage = System.Drawing.Image.FromStream(new MemoryStream(imageFile))) {
Size newSize = CalculateDimensions(oldImage.Size, targetSize);
using (Bitmap newImage = new Bitmap(newSize.Width, newSize.Height, PixelFormat.Format24bppRgb)) {
using (Graphics canvas = Graphics.FromImage(newImage)) {
canvas.SmoothingMode = SmoothingMode.AntiAlias;
canvas.InterpolationMode = InterpolationMode.HighQualityBicubic;
canvas.PixelOffsetMode = PixelOffsetMode.HighQuality;
canvas.DrawImage(oldImage, new Rectangle(new Point(0, 0), newSize));
MemoryStream m = new MemoryStream();
newImage.Save(m, ImageFormat.Jpeg);
return m.GetBuffer();
}
}
}
}
private static Size CalculateDimensions(Size oldSize, int targetSize) {
Size newSize = new Size();
if (oldSize.Height > oldSize.Width) {
newSize.Width = (int)(oldSize.Width * ((float)targetSize / (float)oldSize.Height));
newSize.Height = targetSize;
} else {
newSize.Width = targetSize;
newSize.Height = (int)(oldSize.Height * ((float)targetSize / (float)oldSize.Width));
}
return newSize;
}
}
Dalam kode di atas, targetSize merupakan target panjang image yang akan diperoleh. Untuk mengirimkan gambar ke client, dibutuhkan sebuah handler.
Berikut adalah handler mengirimkan image ke client. Kode dibawah disimpan dalam file dengan extention .ashx yang akan dikerjakan oleh web server sebagai sebuah web handler.
<%@ WebHandler Language="C#" Class="Handler" %>
using System;
using System.IO;
using System.Web;
public class Handler : IHttpHandler {
public bool IsReusable {
get {
return true;
}
}
public void ProcessRequest (HttpContext context) {
// Set up the response settings
context.Response.ContentType = "image/jpeg";
context.Response.Cache.SetCacheability(HttpCacheability.Public);
context.Response.BufferOutput = false;
// Get photo from file system
string filename = context.Request.QueryString("FileName");
if (filename != null)
{
using (FileStream fileStream = new FileStream(context.Server.MapPath("images\\" + filename)))
{
using (BinaryReader reader = new BinaryReader(fileStream))
{
byte[] imageFile = reader.ReadBytes(fileStream.Length);
byte[] stream;
stream = (context.Request.QueryString("Size") != null) ? PhotoManager.ResizeImageFile(imageFile, int.Parse(context.Request.QueryString("Size"))) : imageFile;
// Write image stream to the response stream
const int buffersize = 1024 * 16;
byte[] buffer = new byte[buffersize];
int count = stream.Read(buffer, 0, buffersize);
while (count > 0)
{
context.Response.OutputStream.Write(buffer, 0, count);
count = stream.Read(buffer, 0, buffersize);
}
}
}
}
}
}
Pada halaman web tinggal panggil handler yang telah dibuat dengan querystring nama file dan ukuran image.
<img src="Handler.ashx?FileName=myimage.jpg&Size=320"style="border:4px solid white" alt="My Image" />