我有一个简单的MVC2应用程序,它将文件从浏览器上传到MS SQL数据库,作为图像blob。
然后我可以用以下内容返回结果:
public FileContentResult ShowPhoto(int id)
{
TemporaryImageUpload tempImageUpload = new TemporaryImageUpload();
tempImageUpload = _service.GetImageData(id) ?? null;
if (tempImageUpload != null)
{
byte[] byteArray = tempImageUpload.TempImageData;
return new FileContentResult (temp, "image/jpeg");
}
return null;
}
但是我希望将这些图像重新调整为缩略图和图库大小的视图。这个结果可以做到这一点吗?我一直在玩伟大的imageresizer.net,但似乎想要将图像存储在我想要避免的服务器上。是否有可能在飞行中做到这一点..?
我需要保留原始文件,如果可能的话,不要将图像存储为服务器上的文件。
感谢您的任何指示!
答案 0 :(得分:11)
ImageResizer.NET允许您将流传递给它以进行大小调整,请参阅Managed API usage
您使用的方法是:
ImageResizer.ImageBuilder.Current.Build(对象源,对象dest,ResizeSettings设置)
我修改了你的方法以这种方式去做,但它没有经过测试。希望它有所帮助。
public FileContentResult ShowPhoto(int id)
{
TemporaryImageUpload tempImageUpload = new TemporaryImageUpload();
tempImageUpload = _service.GetImageData(id) ?? null;
if (tempImageUpload != null)
{
byte[] byteArray = tempImageUpload.TempImageData;
using(var outStream = new MemoryStream()){
using(var inStream = new MemoryStream(byteArray)){
var settings = new ResizeSettings("maxwidth=200&maxheight=200");
ImageResizer.ImageBuilder.Current.Build(inStream, outStream, settings);
var outBytes = outStream.ToArray();
return new FileContentResult (outBytes, "image/jpeg");
}
}
}
return null;
}
答案 1 :(得分:4)
最近在Image Resizing播放了Hanselminutes播客,Nathanael Jones讨论了图片大小调整的一些陷阱。
即使您没有30分钟的时间来收听完整的播客,节目笔记也会指向一些有趣的resizing pitfalls,以及由Nathanael Jones编写的调整大小library的图像。< / p>
答案 2 :(得分:3)
您可以动态调整图像大小:
public void ResizeImage(Stream input, Stream output, int newWidth, int maxHeight)
{
using (var srcImage = Image.FromStream(input))
{
int newHeight = srcImage.Height * newWidth / srcImage.Width;
if (newHeight > maxHeight)
{
newWidth = srcImage.Width * maxHeight / srcImage.Height;
newHeight = maxHeight;
}
using (var newImage = new Bitmap(newWidth, newHeight))
using (var gr = Graphics.FromImage(newImage))
{
gr.SmoothingMode = SmoothingMode.AntiAlias;
gr.InterpolationMode = InterpolationMode.HighQualityBicubic;
gr.PixelOffsetMode = PixelOffsetMode.HighQuality;
gr.DrawImage(srcImage, new Rectangle(0, 0, newWidth, newHeight));
newImage.Save(output, ImageFormat.Jpeg);
}
}
}
然后你可以有2个控制器动作(一个显示完整的图像大小,一个显示缩略图):
public ActionResult Thumbnail(int id)
{
var tempImageUpload = new TemporaryImageUpload();
tempImageUpload = _service.GetImageData(id) ?? null;
if (tempImageUpload == null)
{
return HttpNotFound();
}
using (var input = new MemoryStream(tempImageUpload.TempImageData))
using (var output = new MemoryStream())
{
ResizeImage(input, output, 640, 1000);
return File(output.ToArray(), "image/jpeg");
}
}