Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    text
    copied!<p>I wrote this up just for you :) ... I tested it by trying all of the cases in <a href="http://www.binarymoon.co.uk/demo/timthumb-basic/">http://www.binarymoon.co.uk/demo/timthumb-basic/</a> and comparing it visually side by side with my code. As far as I can tell it's basically identical. With that said it does not support the 'zc' flag.</p> <p>I wrote it as a generic handler (ashx file) so that it should run faster. Imaging caching is supported but I commented it out since it makes testing fixes very tough. Feel free to uncomment it for improved performance over the long run (one block right at the beginning and one near the end when it writes it to the memory stream).</p> <p>---Code---</p> <pre><code>&lt;%@ WebHandler Language="VB" Class="Thumb" %&gt; Imports System Imports System.Web Imports System.Drawing Imports System.IO Public Class Thumb : Implements IHttpHandler Private Shared _DefaultWidth As Integer = 100 Private Shared _DefaultHeight As Integer = 100 Private Shared _DefaultQuality As Integer = 90 Public Sub ProcessRequest(ByVal context As HttpContext) Implements IHttpHandler.ProcessRequest ''check the cache for the image first 'Dim cacheObj As Object = context.Cache("Thumb-" + context.Request.Url.ToString().ToLower()) 'If cacheObj IsNot Nothing Then ' Dim msCache As MemoryStream = DirectCast(cacheObj, MemoryStream) ' WriteImage(msCache, context) ' Exit Sub 'End If 'process request (since it wasn't in the cache) Dim imgPath As String = context.Request.QueryString("src") If String.IsNullOrEmpty(imgPath) Then context.Response.End() End If 'get image path on server Dim serverPath As String = context.Server.MapPath(imgPath) If Not File.Exists(serverPath) Then context.Response.End() End If 'load image from file path Dim img As Image = Bitmap.FromFile(serverPath) Dim origRatio As Double = (Math.Min(img.Width, img.Height) / Math.Max(img.Width, img.Height)) '---Calculate thumbnail sizes--- Dim destWidth As Integer = 0 Dim destHeight As Integer = 0 Dim destRatio As Double = 0 Dim qW As String = context.Request.QueryString("w") Dim qH As String = context.Request.QueryString("h") If Not String.IsNullOrEmpty(qW) Then Int32.TryParse(qW, destWidth) If destWidth &lt; 0 Then destWidth = 0 End If End If If Not String.IsNullOrEmpty(qH) Then Int32.TryParse(qH, destHeight) If destHeight &lt; 0 Then destHeight = 0 End If End If 'if both width and height are 0 then use defaults (100x100) If destWidth = 0 And destHeight = 0 Then destWidth = _DefaultWidth destHeight = _DefaultHeight 'else, if the width is specified, calculate an appropriate height ElseIf destWidth &gt; 0 And destHeight &gt; 0 Then 'do nothing, we have both sizes already ElseIf destWidth &gt; 0 Then destHeight = Math.Floor(img.Height * (destWidth / img.Width)) ElseIf destHeight &gt; 0 Then destWidth = Math.Floor(img.Width * (destHeight / img.Height)) End If destRatio = (Math.Min(destWidth, destHeight) / Math.Max(destWidth, destHeight)) 'calculate source image sizes (rectangle) to get pixel data from Dim sourceWidth As Integer = img.Width Dim sourceHeight As Integer = img.Height Dim sourceX As Integer = 0 Dim sourceY As Integer = 0 Dim cmpx As Integer = img.Width / destWidth Dim cmpy As Integer = img.Height / destHeight 'selection is based on the smallest dimension If cmpx &gt; cmpy Then sourceWidth = img.Width / cmpx * cmpy sourceX = ((img.Width - (img.Width / cmpx * cmpy)) / 2) ElseIf cmpy &gt; cmpx Then sourceHeight = img.Height / cmpy * cmpx sourceY = ((img.Height - (img.Height / cmpy * cmpx)) / 2) End If '---create the new thumbnail image--- Dim bmpThumb As New Bitmap(destWidth, destHeight) Dim g = Graphics.FromImage(bmpThumb) g.InterpolationMode = Drawing2D.InterpolationMode.HighQualityBicubic g.CompositingQuality = Drawing2D.CompositingQuality.HighQuality g.SmoothingMode = Drawing2D.SmoothingMode.AntiAlias g.DrawImage(img, _ New Rectangle(0, 0, destWidth, destHeight), _ New Rectangle(sourceX, sourceY, sourceWidth, sourceHeight), GraphicsUnit.Pixel) '-----write out Thumbnail to the output stream------ 'get jpeg image coded info so we can use it when saving Dim ici As Imaging.ImageCodecInfo = Imaging.ImageCodecInfo.GetImageEncoders().Where(Function(c) c.MimeType = "image/jpeg").First() 'save image to memory stream Dim ms As New MemoryStream() bmpThumb.Save(ms, ici, BuildQualityParams(context)) ''save image to cache for future use 'context.Cache("Thumb-" + context.Request.Url.ToString().ToLower()) = ms 'write the image out WriteImage(ms, context) End Sub Private Sub WriteImage(ByVal ms As MemoryStream, ByVal context As HttpContext) 'clear the response stream context.Response.Clear() 'set output content type to jpeg context.Response.ContentType = "image/jpeg" 'write memory stream out ms.WriteTo(context.Response.OutputStream) 'flush the stream and end the response context.Response.Flush() context.Response.End() End Sub 'for adjusting quality setting if needed, otherwise 90 will be used Private Function BuildQualityParams(ByVal context As HttpContext) As Imaging.EncoderParameters Dim epParams As New Imaging.EncoderParameters(1) Dim q As Integer = _DefaultQuality Dim strQ As String = context.Request.QueryString("q") If Not String.IsNullOrEmpty(strQ) Then Int32.TryParse(strQ, q) End If epParams.Param(0) = New Imaging.EncoderParameter(Imaging.Encoder.Quality, q) Return epParams End Function Public ReadOnly Property IsReusable() As Boolean Implements IHttpHandler.IsReusable Get Return False End Get End Property End Class </code></pre> <p>---Test Cases---</p> <pre><code>&lt;img alt="" src="Thumb.ashx?src=~/images/castle1.jpg" /&gt; &lt;br /&gt; &lt;img alt="" src="Thumb.ashx?src=~/images/castle1.jpg&amp;q=100" /&gt; &lt;br /&gt; &lt;img alt="" src="Thumb.ashx?src=~/images/castle1.jpg&amp;q=10" /&gt; &lt;br /&gt; &lt;img alt="" src="Thumb.ashx?src=~/images/castle1.jpg&amp;w=200" /&gt; &lt;br /&gt; &lt;img alt="" src="Thumb.ashx?src=~/images/castle1.jpg&amp;h=150" /&gt; &lt;br /&gt; &lt;img alt="" src="Thumb.ashx?src=~/images/castle1.jpg&amp;h=180&amp;w=120" /&gt; &lt;br /&gt; &lt;img alt="" src="Thumb.ashx?src=~/images/castle1.jpg&amp;h=80&amp;w=210" /&gt; &lt;br /&gt; </code></pre>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload