我仍在使用c#和Webmatrix学习ASP.NET。我已经组建了一个摄影比赛网站,但是找不到上传图片的理想方式。我没有看到上传大于1200x900(投影仪最大分辨率)的图像,所以要确保图像尽可能小。
我正在使用标签并检查图像大小。如果它太大我在保存时使用'ImageResizer'来调整图像大小。我知道检查大小的唯一方法是使用System.Drawing.Image将'HttpPostedFileBase'文件转换为图像。但是当图像是36M像素(它是一个摄影俱乐部)时,这需要一个年龄来阅读高度和宽度属性。我可以只加载前x个字节来读取属性,还是我必须读取整个图像?
我转换为图像的第二个原因是提取exif数据。再次有一种更简单,更快捷的方式来读取exif数据吗?
我希望我的问题有道理,这对我来说有点新鲜。
简化代码:
HttpPostedFileBase uploadedFile = Request.Files[0];
using (System.Drawing.Image image = System.Drawing.Image.FromStream(uploadedFile.InputStream, true, true))
{
string Exif;
System.Text.ASCIIEncoding encoding = new System.Text.ASCIIEncoding();
try{
Exif = encoding.GetString(image.GetPropertyItem(36867).Value);
}
catch
{
Exif="";
}
if (image.Width <Convert.ToInt32(MaxWidth) && image.Height <Convert.ToInt32(MaxHeight))
{
// SAVE IMAGE AS IS
image.Save(fileSavePath);
// LOAD IMAGE DETAILS WITH EXIF
db.Execute("INSERT INTO CompImages (ImageTitle,CompID,GroupID,ClubID,FileName,UserID,ExifDate) VALUES(@0,@1,@2,@3,@4,@5,@6)",ImageTitle,CompID,GroupID,ClubID,fileName,WebSecurity.CurrentUserId,DateTaken);
}
else
{
// LOAD IMAGE DETAILS WITH EXIF
db.Execute("INSERT INTO CompImages (ImageTitle,CompID,GroupID,ClubID,FileName,UserID,ExifDate) VALUES(@0,@1,@2,@3,@4,@5,@6)",ImageTitle,CompID,GroupID,ClubID,fileName,WebSecurity.CurrentUserId,DateTaken);
// RESIZE IMAGE
ImageResizer.ImageJob iF = new ImageResizer.ImageJob(image, "~/UpImages/"+CompID+"/"+fileName, new ImageResizer.ResizeSettings(
"width="+MaxWidth+";height="+MaxHeight+";format=jpg;mode=max"));
iF.CreateParentDirectory = true; //自动创建uploads目录。 iF.Build();
}
}
答案 0 :(得分:0)
我知道检查大小的唯一方法是转换 使用System.Drawing.Image将'HttpPostedFileBase'文件转换为图像。
您也可以直接结帐ContentLength
财产:
int uploadedFileSize = uploadedFile.ContentLength;
我转换为图像的第二个原因是提取exif 数据。再次有一种更简单,更快捷的方式来读取exif数据吗?
我不知道BCL中的内置类允许您在不将图像加载到内存中的情况下读取EXIF信息,但您可以使用像这样的第三方库:http://www.codeproject.com/Articles/36342/ExifLib-A-Fast-Exif-Data-Extractor-for-NET-2-0