【发布时间】:2011-07-21 13:45:42
【问题描述】:
我正在将网络表单应用程序迁移到 MVC3。具有讽刺意味的是,除了一件事之外,一切都是很酷的豆子——图像是由处理程序提供的,特别是Microsoft Generated Image Handler。它工作得非常好——平均一张 450kb 的照片以大约 20kb 的速度输出。
实际的photo on disk 大小为 417kb,因此我得到了很大的缩减。
转到 MVC3 我想删除处理程序并使用控制器操作。但是,在渲染图像时,我似乎无法实现相同类型的文件大小减小。我浏览了源代码并获取了他们image transform code 的精确副本,但我只达到了 230~kb,这仍然比 ms 处理程序输出的 16kb 大得多。
你可以see an example of both the controller and the handler here
我浏览了处理程序源代码,看不到任何进一步压缩图像的内容。如果您检查这两个图像,您会发现差异 - 处理程序渲染的图像不太清晰,看起来更有颗粒感,但我仍然认为满足我的需求。
有人可以在这里给我任何指示吗?是否以某种方式使用了输出压缩?还是我忽略了一些非常明显的东西?
下面的代码在我的家庭控制器中用于渲染图像,并且是处理程序使用的Image Transform class 中的 FitImage 方法的精确副本...
public ActionResult MvcImage()
{
var file = Server.MapPath("~/Content/test.jpg");
var img = System.Drawing.Image.FromFile(file);
var sizedImg = MsScale(img);
var newFile = Server.MapPath("~/App_Data/test.jpg");
if (System.IO.File.Exists(newFile))
{
System.IO.File.Delete(newFile);
}
sizedImg.Save(newFile);
return File(newFile, "image/jpeg");
}
private Image MsScale(Image img)
{
var scaled_height = 267;
var scaled_width = 400;
int resizeWidth = 400;
int resizeHeight = 267;
if (img.Height == 0)
{
resizeWidth = img.Width;
resizeHeight = scaled_height;
}
else if (img.Width == 0)
{
resizeWidth = scaled_width;
resizeHeight = img.Height;
}
else
{
if (((float)img.Width / (float)img.Width < img.Height / (float)img.Height))
{
resizeWidth = img.Width;
resizeHeight = scaled_height;
}
else
{
resizeWidth = scaled_width;
resizeHeight = img.Height;
}
}
Bitmap newimage = new Bitmap(resizeWidth, resizeHeight);
Graphics gra = Graphics.FromImage(newimage);
SetupGraphics(gra);
gra.DrawImage(img, 0, 0, resizeWidth, resizeHeight);
return newimage;
}
private void SetupGraphics(Graphics graphics)
{
graphics.CompositingMode = CompositingMode.SourceCopy;
graphics.CompositingQuality = CompositingQuality.HighSpeed;
graphics.InterpolationMode = InterpolationMode.HighQualityBicubic;
graphics.SmoothingMode = SmoothingMode.HighSpeed;
}
【问题讨论】:
标签: asp.net-mvc-3 httphandler image-scaling