您好: 在我的应用程序中,我有一些图像保存在数据库中,所以我创建了一个ImgDownLoad.aspx来检索图像并重新调整它们,因为数据库中的图像可能非常大(其中一些超过20M),所以我生成一些缩略图,这是代码:
page_load(){
string id=Requset.QueryString["id"];
string imgtype=Requset.Querystring["itype"];
if(imgType=="small")
{
//request the thumbnail
string small_loaction=getSmallLocationById(id);
if(!File.exists(small_location)
{
byte[] img_stream =getStreamFromDb(id);
Image img=Image.frameStream(new MemsorStream(img_steam));//here,I often get the out of memory error,but I am not sure when it will happen.
generateSmallImage(img,location)
}
Response.TransferFile(small_location);
}
else if(imgType=="large"){
byte[] img_stream =getStreamFromDb(id);
new MemorySteam(img_stream).writeTo(Response.outputstream);
}
}
有什么不对吗?
另外,由于我不知道图像格式,所以我无法添加
Response.contenttype="image/xxx";
让我最困惑的是我会遇到内存不足错误,所以我更改了代码:
try{
byte[] img_stream =getStreamFromDb(id);
Image img=Image.frameStream(new MemsorStream(img_steam));//here,I often get the out of memory error,but I am not sure when it will happen.
generateSmallImage(img,location)
}
catche(exceptin e){
//the small image can not generated,just return the whole image
new MemorySteam(img_stream).writeTo(Response.outputstream);
return;
}
在这种情况下,我会避免内存不足的问题,但有些大图像有时无法下载。
所以我想知道是否有办法处理大图像流?
拍摄大图像:
resolution:12590x4000
size:26M.
事实上,我用mspaint打开了一张大图像(差不多24M),然后再次保存图像,我发现它的尺寸比起初要小得多。那么可以在服务器端调整图像大小吗?还是其他好礼貌来解决我的问题?
答案 0 :(得分:0)
首先,你不是你创建的Image
和Stream
类型实例的disposing - 随后的调用,随着时间的推移,这必然会导致问题;尤其是20meg左右的图像!
另外,为什么每次通话都会创建缩略图?创建一次和cache,或刷新到磁盘:无论哪种方式,都提供“你之前制作的”,而不是一遍又一遍地进行处理。
但是,我建议您尝试最小化图像的大小(以字节为单位)。有人可能会争辩说,如果超过1meg,它们不应该在数据库中,而是将它们存储在磁盘上,并将数据存储在数据库中。我想这可以辩论,browse if interested。
对于你的评论,我敦促你不要让其他范围控制另一个人拥有的资源;处理创建它们的范围内的项目(显然有时需要保留一些东西,但应该清楚它们的责任)。以下是对您的一些代码的一些修改:
if (imgType == "small")
{
string small_loaction = getSmallLocationById(id);
if(!File.exists(small_location)
{
byte[] imageBytes = getStreamFromDb(id);
using (var imageStream = new MemoryStream(imageBytes))
{
using (var image = Image.FromStream(imageStream))
{
generateSmallImage(image, small_location)
}
}
}
Response.TransferFile(small_location);
}
else if (imgType=="large")
{
byte[] imageBytes = getStreamFromDb(id);
Response.OutputStream.Write(imageBytes, 0, imageBytes.Length);
}