上传图片我在客户端使用plupload。然后在我控制下我有下一个逻辑:
public ActionResult UploadFile()
{
try
{
var file = Request.Files.Count > 0 ? Request.Files[0] : null;
using (var fileStream = new MemoryStream())
{
using (var oldImage = new Bitmap(file.InputStream))
{
var format = oldImage.RawFormat;
using (var newImage = ImageUtility.ResizeImage(oldImage, 800, 2000))
{
newImage.Save(fileStream, format);
}
byte[] bits = fileStream.ToArray();
}
}
{
catch (Exception ex)
{
}
}
ImageUtility.ResizeImage方法:
public static class ImageUtility
{
public static Bitmap ResizeImage(Bitmap image, int width, int height)
{
if (image.Width <= width && image.Height <= height)
{
return image;
}
int newWidth;
int newHeight;
if (image.Width > image.Height)
{
newWidth = width;
newHeight = (int)(image.Height * ((float)width / image.Width));
}
else
{
newHeight = height;
newWidth = (int)(image.Width * ((float)height / image.Height));
}
var newImage = new Bitmap(newWidth, newHeight);
using (var graphics = Graphics.FromImage(newImage))
{
graphics.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
graphics.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;
graphics.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.HighQuality;
graphics.FillRectangle(Brushes.Transparent, 0, 0, newWidth, newHeight);
graphics.DrawImage(image, 0, 0, newWidth, newHeight);
return newImage;
}
}
}
我在这里的问题是图像尺寸增加了。 我上传了1.62MB的图像,在调用此控制器之后,如果使用Bitmap创建实例,然后将Bitmap保存到文件流并使用&#34; fileStream.ToArray()读取位;&#34;我得到2.35MB&#34; bit&#34;。
有人能告诉我在将其保存为位图后增加图像尺寸的原因是什么。我需要Bitmap,因为我需要检查上传图像的高度和高度,如果需要,请调整大小。
答案 0 :(得分:0)
答案很简单,位图占用了更多的内存,无论以前的图像是什么格式,因为它在保存之后保持未压缩格式。
答案 1 :(得分:0)
jpeg,png,gif等被压缩,因此使用的字节数少于未压缩的位图。
如果您只想保存原始图像,只需保存file.InputStream。
如果需要调整大小,可以使用库来应用jpg / png / etc压缩,然后保存结果。
答案 2 :(得分:0)
这里的目标是什么?你只是想上传图片吗?是否需要将其验证为图像?或者您只是想上传文件?
如果上传是目标,不考虑验证,只需移动位并使用文件名保存它们。一旦你这样做......
using (var oldImage = new Bitmap(file.InputStream))
...您正在转换为位图。这是您告诉位图使用什么格式(原始)的地方。
var format = oldImage.RawFormat;
如果您只想移动文件(上传),则可以将内存流运行到文件流对象并保存位。
如果你想对图像是否为空等进行一些检查,你可以尝试这个页面(http://www.codeproject.com/Articles/1956/NET-Image-Uploading),但是要意识到它仍然把它放在一个图像中,如果你只是简单的话,这不是你想要的想保存&#34;按原样#34;。