gpt4 book ai didi

php - asp.net 版本的 timthumb php 类

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:01:52 25 4
gpt4 key购买 nike

有人知道著名的 PHP 类“timthumb”的 ASP.Net 版本吗?只需要一个脚本,它将在“timthumb”的同一行中工作,并为任何大小的图像生成质量好的基于方形或比例的缩略图。

这是指向 php 类的链接:http://www.darrenhoyt.com/2008/04/02/timthumb-php-script-released/

最佳答案

我专门为你写了这篇文章 :) ... 我通过尝试 http://www.binarymoon.co.uk/demo/timthumb-basic/ 中的所有案例对其进行了测试并将其与我的代码并排进行视觉比较。据我所知,它基本上是相同的。话虽如此,它不支持“zc”标志。

我将其编写为通用处理程序(ashx 文件),以便它运行得更快。支持图像缓存,但我将其注释掉,因为它使测试修复变得非常困难。从长远来看,可以随意取消注释以提高性能(一个 block 在开头,一个 block 在将其写入内存流时接近结尾)。

---代码---

<%@ WebHandler Language="VB" Class="Thumb" %>

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 < 0 Then
destWidth = 0
End If
End If

If Not String.IsNullOrEmpty(qH) Then
Int32.TryParse(qH, destHeight)
If destHeight < 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 > 0 And destHeight > 0 Then
'do nothing, we have both sizes already
ElseIf destWidth > 0 Then
destHeight = Math.Floor(img.Height * (destWidth / img.Width))
ElseIf destHeight > 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 > cmpy Then
sourceWidth = img.Width / cmpx * cmpy
sourceX = ((img.Width - (img.Width / cmpx * cmpy)) / 2)
ElseIf cmpy > 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

---测试用例---

<img alt="" src="Thumb.ashx?src=~/images/castle1.jpg" /> 
<br />
<img alt="" src="Thumb.ashx?src=~/images/castle1.jpg&q=100" />
<br />
<img alt="" src="Thumb.ashx?src=~/images/castle1.jpg&q=10" />
<br />
<img alt="" src="Thumb.ashx?src=~/images/castle1.jpg&w=200" />
<br />
<img alt="" src="Thumb.ashx?src=~/images/castle1.jpg&h=150" />
<br />
<img alt="" src="Thumb.ashx?src=~/images/castle1.jpg&h=180&w=120" />
<br />
<img alt="" src="Thumb.ashx?src=~/images/castle1.jpg&h=80&w=210" />
<br />

关于php - asp.net 版本的 timthumb php 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4436209/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com