wpf在image控件上快速显示内存图像
这是在博客园的第一篇文章
如果你在寻找能够快速在image控件刷新大图像(比如分辨率3000*3000的图像)的办法,尤其是想把内存中的裸数据(只有图像的数据,不包含图像头等信息)快速显示到界面,那么你来对地方了,看完这篇博客会解决困扰了你一天,或者一个礼拜,或者一年,或者一辈子的问题,时间的长短取决于你看到这篇博客的时间。
请注意:如果本篇博客对于解决你的问题起到了决定性的作用,那么请在你的代码里加上以下两行内容,请尊重别人的努力。转载请注明出处
// provide by zhangshaohui
// 本文网址
以下是正文:
在你寻找解决方案的过程中,一定看到过这样的代码:
1、这个代码最常见,网上到处都是,的确可以用,也简单清晰,但是速度太慢,显示一个3000*3000的大概要40ms,我跟踪了一下代码,主要是new stream,以及EndInit比较耗时,但是用这个方法又绕不过去这两行代码。
public BitmapImage BitmapToBitmapImage(Bitmap bitmap)
{
using (MemoryStream stream = new MemoryStream())
{
bitmap.Save(stream, ImageFormat.Png);
stream.Position = ;
BitmapImage result = new BitmapImage();
result.BeginInit();
result.CacheOption = BitmapCacheOption.OnLoad;
result.StreamSource = stream;
result.EndInit();
result.Freeze();
return result;
} }
2、这个也是常见的办法,好像还是msdn上推荐的,缺点是更慢
public static ImageSource ChangeBitmapToImageSource(Bitmap bitmap)
{
IntPtr hBitmap = bitmap.GetHbitmap();
ImageSource wpfBitmap = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(
hBitmap,
IntPtr.Zero,
Int32Rect.Empty,
BitmapSizeOptions.FromEmptyOptions()); if (!APIConverter.DeleteObject(hBitmap))
{
throw new System.ComponentModel.Win32Exception();
}
return wpfBitmap;
}
如果对于显示速度没有什么要求,那么这两个办法还是可以用用的,但是如果对于性能有要求,而且又数据量很大,比如接收超高清的视频数据,那么这两个方法是完全满足不了需求的。
本文的方案是:
1、以显示3000 * 3000的图像为例,下面的代码是伪代码
2、定义ImageSource ImgSource,ImgSource绑定到image控件的Source属性
3、PixelFormats.Gray16,定义为PixelFormats.Gray8也是可以的,不过就需要在WriteableBitmap构造函数最后一个参数添加伪彩表,当然还可定义rgb的格式,这个看裸数据的格式以及需求来了,这里只是抛砖引玉,方法是通用的。
4、本方案的优点是没有频繁的内存分配和释放,既节省时间,又不用担心内存溢出,想更新哪里更新哪里,代码简单易懂,速度极快
ViewModel中
public class MainWindowViewModel : ViewModelBase
{
private WriteableBitmap _wbBitmap; public MainWindowViewModel()
{
_wbBitmap = new WriteableBitmap(, , , , PixelFormats.Gray16, null);
ImgSource = _wbBitmap;
}
public void ShowImage(short[] rawData)// rawData是存储图像裸数据的buffer
{
unsafe
{
_wbBitmap.Lock();
Marshal.Copy(rawData,,_wbBitmap.BackBuffer,3000*3000); //请注意_wbBitmap的数据格式以及buffer大小,以免溢出和显示异常
_wbBitmap.AddDirtyRect(new System.Windows.Int32Rect(, , , )); _wbBitmap.Unlock(); } } }
wpf在image控件上快速显示内存图像的更多相关文章
- VC/MFC 当鼠标移到控件上时显示提示信息
VC/MFC 当鼠标移到控件上时显示提示信息 ToolTip是Win32中一个通用控件,MFC中为其生成了一个类CToolTipCtrl,总的说来其使用方法是较简单的,下面讲一下它的一般用法和高级用法 ...
- 如何:使用TreeView控件实现树结构显示及快速查询
本文主要讲述如何通过使用TreeView控件来实现树结构的显示,以及树节点的快速查找功能.并针对通用树结构的数据结构存储进行一定的分析和设计.通过文本能够了解如何存储层次结构的数据库设计,如何快速使用 ...
- 05_android入门_GET方式实现登陆(在控件上显示服务端返回的内容)
当点击登陆之后,怎么把server端返回的数据,写到指定的控件上尼?,在android怎么实现尼?以下我们通过详细的代码进行分析和实现,希望能对你,在学习android知识上有所帮助. 以下通过代码说 ...
- 对话框上动态控件的创建、在Picture Control控件上显示图片
1 MFC对话框之上的动态控件的创建 对话框上的控件是MFC类的一个具体对象. 当在对话框之上使用静态控件时,可以根据类向导来为每个控件添加消息.响应函数以及变量. 当需要在对话框中动态的创建某个控 ...
- WPF如何将数据库中的二进制图片数据显示在Image控件上
首先在xaml文件里定义一个Image控件,取名为img MemoryStream stream = new MemoryStream(获得的数据库对象): BitMapImage bmp = new ...
- WPF中ContextMenu(右键菜单)使用Command在部分控件上默认为灰色的处理方法
原文:WPF中ContextMenu(右键菜单)使用Command在部分控件上默认为灰色的处理方法 问题描述 今天发现如果我想在一个TextBlock弄一个右键菜单,并且使用Command绑定,结果发 ...
- Qt中,将以png为格式的图片在按钮控件上显示
在Qt编程中,我们常常会遇见这样或那样的小问题,这里,我介绍一个将png为格式的图片在按钮控件上显示的小功能. resistanceBtn = new QPushButton(element); re ...
- 在 WPF 中如何在控件上屏蔽系统默认的触摸长按事件
来源:https://stackoverflow.com/questions/5962108/disable-a-right-click-press-and-hold-in-wpf-applicati ...
- 浅尝辄止WPF自定义用户控件(实现颜色调制器)
主要利用用户控件实现一个自定义的颜色调制控件,实现一个小小的功能,具体实现界面如下. 首先自己新建一个wpf的用户控件类,我就放在我的wpf项目的一个文件夹下面,因为是一个很小的东西,所以就没有用mv ...
随机推荐
- java StringBuilder案例
实现输出字符串的长度,容量(容量不够则扩容),及内容 import java.util.Arrays; public class MyStringBuilderDemo { //任务:存储字符串并输出 ...
- oracle查看用户属于哪个表空间
select username,default_tablespace from dba_users where username='用户名';
- [SDOI2014]LIS
这道题还是非常好的 首先第一问可以让我们联想到某网络流二十四题里的一道题,发现建图方式应该和这道题差不多啊 所以首先跑一遍\(dp\),求出\(dp[i]\)表示\(i\)位置结束的\(LIS\)长度 ...
- 韩天峰力荐 Swoole入门到实战打造高性能赛事直播平台
第1章 课程介绍欢迎大家来到swoole的课程!本章主要是介绍了swoole的一些特性,以及使用场景,并且分享了swoole在其他公司的一些案例,最后重点讲解了swoole学习的一些准备工作.1-1 ...
- 初识Qt鼠标、键盘事件及定时器和随机数
1.新建Qt Gui应用,项目名称为“myEvent”,基类名称为QWidget,类名称为Widget. 2.widget.h文件中添加以下代码,该段代码中包含了三个事件函数和一个槽函数 privat ...
- 论文笔记 Robust face landmark estimation under occlusion
1. Abstract 现实世界中的人脸很多时候都存在遮挡以及大的形状变化,而目前的人脸关键点检测方法在这种情况下表现欠佳, 因为它们未能提供一种系统的方法来处理异常.因而authors提出一种新的方 ...
- assignment1SVM的一些经验
def svm_loss_vectorized(W, X, y, reg): """ Structured SVM loss function, vectorized i ...
- SQL AND & OR 运算符
AND 和 OR 运算符用于基于一个以上的条件对记录进行过滤. AND 和 OR 运算符 AND 和 OR 可在 WHERE 子语句中把两个或多个条件结合起来. 假设第一个条件和第二个条件都成立,则 ...
- CO借贷标识及转换
前台提前数据源0CO_PC_01的数据时发现借贷方有O.C.S.D.不是传统的FI借贷标识(S = 借记,H = 贷记). 由"D"指出贷方记帐.从以下项中发生这些记帐 财务会计中 ...
- 大数据入门:Hadoop安装、环境配置及检测
目录 1.导包Hadoop包 2.配置环境变量 3.把winutil包拷贝到Hadoop bin目录下 4.把Hadoop.dll放到system32下 5.检测Hadoop是否正常安装 5.1在ma ...