深入分析WPF客户端读取高清图片卡以及缩略图的解决方法详解
程序员文章站
2023-12-16 22:57:58
在ftp上传上,有人上传了高清图片,每张图片大约2m。如果使用传统的bitmapimage类,然后绑定 source 属性的方法,有些电脑在首次会比较卡,一张电脑10秒,4...
在ftp上传上,有人上传了高清图片,每张图片大约2m。
如果使用传统的bitmapimage类,然后绑定 source 属性的方法,有些电脑在首次会比较卡,一张电脑10秒,4张大约会卡40秒。
所以我先异步的下载图片,得到downloadfilestream对象,然后绑定到bitmapimage类上。例如:
system.windows.controls.image photo = new image
{
width = 100,
height = 100,
margin = new thickness(2),
stretch = stretch.uniform
};
bitmapimage bitmap = new bitmapimage();
bitmap.begininit();
bitmap.streamsource = downloadfilestream;
bitmap.endinit();
photo.source = bitmap;
listboxitem lbi = new listboxitem()
{
datacontext = pvo,
content = photo
};
this.lbphotoes.items.add(lbi);
因为bitmap的streamsource比较大,造成lbi对象比较大,所以lbphotoes.items.add 方法在添加了两张图片之后就会卡大约30秒的时间。
所以尝试使用缩略图的方式来使bitmapimage的对象变小,在这里采用缩略图是因为客户端需要图片大小大致是
(100,100)。
完整的代码如下:
system.windows.controls.image photo = new image
{
width = 100,
height = 100,
margin = new thickness(2),
stretch = stretch.uniform
};
using (system.drawing.image drawingimage = system.drawing.image.fromstream(downloadfilestream))
{
using (system.drawing.image thumbimage =
drawingimage.getthumbnailimage(100, 100, () => { return true; }, intptr.zero))
{
memorystream ms = new memorystream();
thumbimage.save(ms, system.drawing.imaging.imageformat.png);
bitmapframe bf = bitmapframe.create(ms);
photo.source = bf;
}
}
listboxitem lbi = new listboxitem()
{
datacontext = pvo,
content = photo
};
this.lbphotoes.items.add(lbi);
在这里,要引用system.drawing.dll.使用system.drawing.image 类的getthumbnailimage 方法来获取thumbimage,接着使用memorystream来保存缩略图的stream,接着用缩略图的stream来生成图片了。
最后说一句:虽然解决了这个问题,不过每次都要下载高清图片,生成缩略图,这是很耗时的,所以在上传图片的时候就应该生成缩略图了,将缩略图保存起来了。因为在局域网中,网速比较快,这种方式基本也可以满足要求了。
如果使用传统的bitmapimage类,然后绑定 source 属性的方法,有些电脑在首次会比较卡,一张电脑10秒,4张大约会卡40秒。
所以我先异步的下载图片,得到downloadfilestream对象,然后绑定到bitmapimage类上。例如:
system.windows.controls.image photo = new image
{
width = 100,
height = 100,
margin = new thickness(2),
stretch = stretch.uniform
};
bitmapimage bitmap = new bitmapimage();
bitmap.begininit();
bitmap.streamsource = downloadfilestream;
bitmap.endinit();
photo.source = bitmap;
listboxitem lbi = new listboxitem()
{
datacontext = pvo,
content = photo
};
this.lbphotoes.items.add(lbi);
因为bitmap的streamsource比较大,造成lbi对象比较大,所以lbphotoes.items.add 方法在添加了两张图片之后就会卡大约30秒的时间。
所以尝试使用缩略图的方式来使bitmapimage的对象变小,在这里采用缩略图是因为客户端需要图片大小大致是
(100,100)。
完整的代码如下:
system.windows.controls.image photo = new image
{
width = 100,
height = 100,
margin = new thickness(2),
stretch = stretch.uniform
};
using (system.drawing.image drawingimage = system.drawing.image.fromstream(downloadfilestream))
{
using (system.drawing.image thumbimage =
drawingimage.getthumbnailimage(100, 100, () => { return true; }, intptr.zero))
{
memorystream ms = new memorystream();
thumbimage.save(ms, system.drawing.imaging.imageformat.png);
bitmapframe bf = bitmapframe.create(ms);
photo.source = bf;
}
}
listboxitem lbi = new listboxitem()
{
datacontext = pvo,
content = photo
};
this.lbphotoes.items.add(lbi);
在这里,要引用system.drawing.dll.使用system.drawing.image 类的getthumbnailimage 方法来获取thumbimage,接着使用memorystream来保存缩略图的stream,接着用缩略图的stream来生成图片了。
最后说一句:虽然解决了这个问题,不过每次都要下载高清图片,生成缩略图,这是很耗时的,所以在上传图片的时候就应该生成缩略图了,将缩略图保存起来了。因为在局域网中,网速比较快,这种方式基本也可以满足要求了。