我有一个调整图像大小的脚本,我没有编写这个脚本,也不知道任何ASP.NET,但是我被分配了修复问题的任务!
问题是,即使上传的文件已设置为正确的大小,调整后的结果图像质量也不如上传。
上传的图片 - http://climatechange.cbi.org.uk/uploaded/whatevhomep.jpg 已调整大小的图片 - http://climatechange.cbi.org.uk/ext_pages/resizeimage.aspx?img=/uploaded/whatevhomep.jpg&w=500
正在进行调整大小的脚本如下,任何想法如何解决问题?
using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Drawing;
using System.Drawing.Imaging;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
public partial class ext_pages_resizeImage : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
//Read in the image filename to create a thumbnail of
String imageUrl = "";
try
{ imageUrl = Request.QueryString["img"].ToString();
}catch(Exception imgEx){}
//Read in the width and height
int thumbWidth = 0;
int imageOrigHeight = 0;
int imageOrigWidth = 0;
try
{
thumbWidth = Convert.ToInt32(Request.QueryString["w"].ToString());
}catch(Exception imgHEx)
{
thumbWidth = Convert.ToInt32(Request.QueryString["amp;w"]);
}
if (!System.IO.File.Exists(Server.MapPath(imageUrl)))
Response.End();
System.IO.FileInfo fileDetails = new System.IO.FileInfo(Server.MapPath(imageUrl));
System.Drawing.Image fullSizeImg;
fullSizeImg = System.Drawing.Image.FromFile(Server.MapPath(imageUrl));
imageOrigHeight = fullSizeImg.Height;
imageOrigWidth = fullSizeImg.Width;
Decimal sizeRatio = ((Decimal)imageOrigHeight / imageOrigWidth);
int thumbHeight = Decimal.ToInt32(sizeRatio * thumbWidth);
if (thumbHeight <= 0 || thumbWidth <= 0)
{
pageMisc oPageMisc = new pageMisc();
oPageMisc.sendMail("tim.payne@epiphanysolutions.co.uk", "CBI CC Image Errors", "Width: " + thumbWidth.ToString() + ", Height: " + thumbHeight.ToString());
}
Bitmap bmp = new Bitmap(thumbWidth, thumbHeight);
System.Drawing.Graphics gr = System.Drawing.Graphics.FromImage(bmp);
gr.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
gr.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;
gr.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High;
System.Drawing.Rectangle rectDestination = new System.Drawing.Rectangle(0, 0, thumbWidth, thumbHeight);
gr.DrawImage(fullSizeImg, rectDestination, 0, 0, imageOrigWidth, imageOrigHeight, GraphicsUnit.Pixel);
switch (fileDetails.Extension.ToUpper())
{
case ".JPG":
Response.ContentType = "image/jpeg";
break;
case ".GIF":
Response.ContentType = "image/gif";
break;
}
//Do we need to create a thumbnail?
if (thumbHeight > 0 && thumbWidth > 0)
{
System.Drawing.Image.GetThumbnailImageAbort dummyCallBack;
dummyCallBack = new System.Drawing.Image.GetThumbnailImageAbort(ThumbnailCallback);
System.Drawing.Image thumbNailImg;
thumbNailImg = fullSizeImg.GetThumbnailImage(thumbWidth, thumbHeight, dummyCallBack, IntPtr.Zero);
switch (fileDetails.Extension.ToUpper())
{
case ".JPG":
bmp.Save(Response.OutputStream, ImageFormat.Jpeg);
break;
case ".GIF":
bmp.Save(Response.OutputStream, ImageFormat.Gif);
break;
}
//Clean up / Dispose...
thumbNailImg.Dispose();
}
else
{
switch (fileDetails.Extension.ToUpper())
{
case ".JPG":
fullSizeImg.Save(Response.OutputStream, ImageFormat.Jpeg);
break;
case ".GIF":
fullSizeImg.Save(Response.OutputStream, ImageFormat.Gif);
break;
}
}
//Clean up / Dispose...
fullSizeImg.Dispose();
bmp.Dispose();
}
public static bool ThumbnailCallback()
{
return false;
}
}
更新显示错误消息
Compiler Error Message: CS0103: The name 'GetEncoder' does not exist in the current context
Source Error:
Line 109: var codecParams = new EncoderParameters(1);
Line 110: codecParams.Param[0] = ratio;
Line 111: fullSizeImg.Save(Response.OutputStream, GetEncoder(ImageFormat.Jpeg), codecParams);
Line 112: break;
Line 113: case ".GIF":
Line: 111
答案 0 :(得分:3)
保存为JPEG时,您需要指定更高的质量。用以下内容替换JPEG case:
case ".JPG":
Encoder quality = Encoder.Quality;
var ratio = new EncoderParameter(quality, 80L);
var codecParams = new EncoderParameters(1);
codecParams.Param[0] = ratio;
fullSizeImg.Save(Response.OutputStream, GetEncoder(ImageFormat.Jpeg), codecParams);
break;
并添加此功能:
private ImageCodecInfo GetEncoder(ImageFormat format)
{
ImageCodecInfo[] codecs = ImageCodecInfo.GetImageDecoders();
foreach (ImageCodecInfo codec in codecs)
if (codec.FormatID == format.Guid)
return codec;
return null;
}
GIF可能需要类似的东西。
答案 1 :(得分:0)
尝试使用GetThumbnailImage函数:
System.Drawing.Image.GetThumbnailImageAbort dummyCallBack
= new System.Drawing.Image.GetThumbnailImageAbort(ThumbnailCallback);
System.Drawing.Image thumbNailImg = fullSizeImg.GetThumbnailImage(
nWidth,
nHeight,
dummyCallBack,
IntPtr.Zero);
ThumnailCallback功能:
//this function is reqd for thumbnail creation
protected bool ThumbnailCallback()
{
return false;
}