我有一个简单的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 但它似乎想将图像存储在我想避免的服务器上。是否可以即时执行此操作..?
我需要保留原始文件,如果可能的话,我不想将图像作为文件存储在服务器上。
感谢您的任何指示!
ImageResizer.NET 允许您将流传递给它以调整大小,请参阅托管 API 用法
您将使用的方法是:
ImageResizer.ImageBuilder.Current.Build(对象源、对象目标、调整大小设置设置)
我修改了您的方法以这种方式进行,但它未经测试。希望对您有所帮助。
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;
}
最近有一个关于图像大小调整的Hanselminutes播客,Nathanael Jones讨论了图像大小调整的一些陷阱。
即使您没有 30 多分钟的时间收听完整的播客,节目笔记也指出了一些有趣的调整大小陷阱,以及同样由 Nathanael Jones 编写的图像大小调整库。
您可以即时调整图像大小:
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");
}
}