一普通显示:现在的VC显示图片非常方便,远不是VC6.0那个年代的技术可比,而且支持多种格式的如JPG,PNG。

CImage _img;

初始化:

_img.Load(L"map.png");

显示:OnPaint事件中

CRect rect;
     this->GetClientRect(&rect);
     HDC hdc=::GetDC(this->m_hWnd);
     _img.Draw(hdc,rect);

几行代码就解决了。

二双缓冲显示:【因为是用了两个CImage实例,要不叫伪双缓冲吧,但实现方式确实是双缓冲,可以完成拼图显示等功能,当然防刷新闪烁是肯定有效的】

当时查了一天的百度,基本没用,第二天起床前想到了一个办法,其实很简单。用Datch什么的分离位图,反而无效,咱百度谷歌都没找到相关资料,所以这也算原创了吧。

CImage img0,img1;

img0.Load("*.png");

img1.Create(w,h,img0.GetBPP());
    HDC tmpdc=img1.GetDC();

先将img0的内存中的图画到img1的DC上,再用img1.Draw到显示设备中。

img0.StretchBlt(tmpdc,0,0,desw,desh,Scr.x,Scr.y,desw,desh);//将源图中RECT(scr.x,scr.y,desw,desh) 区域的图复制到目标区域。

img1.Draw(pdc->m_hDC,r);//r是显示区域,pdc是显示设备。

文章出处:  http://blog.sina.com.cn/s/blog_6ca0f2df0100nlzj.html

下面再贴一个图像缩放 的内容

图像缩放算法及速度优化——(一)最近邻插值

第0节 简介

  图像缩放算法是数字图像处理算法中经常遇到的问题。我们经常会将某种尺寸的图像转换为其他尺寸的图像,如放大或者缩小图像。OpenCV中的Resize() 函数非常方便而且效率非常高。下面是OPENCV提供的cvResize函数原型。

/****************************************************************************************************/
图像大小变换
void cvResize( const CvArr* src, CvArr* dst, int interpolation=CV_INTER_LINEAR );
src
输入图像.
dst
输出图像.
interpolation
插值方法:
CV_INTER_NN - 最近邻插值,
CV_INTER_LINEAR - 双线性插值 (缺省使用)
CV_INTER_AREA - 使用象素关系重采样。当图像缩小时候,该方法可以避免波纹出现。当图像放大时,类似于 CV_INTER_NN 方法..
CV_INTER_CUBIC - 立方插值.
函数 cvResize 将图像 src 改变尺寸得到与 dst 同样大小。若设定 ROI,函数将按常规支持 ROI.
/****************************************************************************************************/

  相信使用过Opencv的朋友都知道如何使用此函数。下面根据我自己的理解,用VC++ 来实现图像缩放算法 ,希望大家能从中理解图像缩放算法的原理。

第1节 最近邻插值

  最简单的图像缩放算法就是最近邻插值。顾名思义,就是将目标图像各点的像素值设为源图像中与其最近的点。假设源图像的宽度和高度分别为w0和h0, 缩放后的目标图像的宽度和高度分别为w1和h1, 那么比例就是float fw = float(w0)/w1; float fh = float(h0)/h1; 对于目标图像中的(x,y)点坐标对应着源图像中的(x0, y0)点。其中:x0 = int(x*fw), y0 = int(y*fh)。

  示例1:现在将一张670*503的BMP图像缩放到200*160,代码和效果如下。

void ResizeNear01(CImage &src, CImage &dst)
{int w0 = src.GetWidth();int h0 = src.GetHeight();int w1 = dst.GetWidth();int h1 = dst.GetHeight();float fw = float(w0) / w1;float fh = float(h0) / h1;int x0, y0;for(int y=0; y<h1; y++){y0 = int(y * fh);for(int x=0; x<w1; x++){x0 = int(x * fw);dst.SetPixel(x, y, src.GetPixel(x0, y0));}}
}

分析:对于此程序,我们将执行此ResizeNear01函数的语句加上一个for循环,使其执行100次,看它的速度怎么样。

#include <time.h>
void CResizeDemoDlg::OnBnClickedButton1()
{// TODO: Add your control notification handler code here
    CImage src, dst;src.Load(L"d:\\1.bmp");dst.Create(200, 160, 24);clock_t start = clock();for(int i=0; i<100; i++){ResizeNear01(src, dst);}float end = float(clock() - start)/CLOCKS_PER_SEC;CString str;str.Format(L"%6.2f", end);MessageBox(str);dst.Save(L"d:\\rs.jpg");
}

  显示程序执行所用的时间为20.59秒,平均一次需要0.2秒,看起来速度还可以,是因为时间复杂度较低。目标图像的尺寸大小是200*160。

  示例2:示例1中的算法可以改进速度的地方有两个。第一,因为最近邻插值算法求源图像中的坐标是固定的,可以把每个目标每个x和每个y对应的值通过一次循环先求出来,再利进入双重循环。第二,使用指针效率更高,如果使用CImage提供的GetPixel和SetPixel是费时间的。

  

//优化后的最近邻插值算法
void ResizeNear02(CImage &src, CImage &dst)
{int w0 = src.GetWidth();int h0 = src.GetHeight();int pitch0 = src.GetPitch();int w1 = dst.GetWidth();int h1 = dst.GetHeight();int pitch1 = dst.GetPitch();float fw = float(w0) / w1;float fh = float(h0) / h1;int *arr_x = new int[w1];int *arr_y = new int[h1];for(int y=0; y<h1; y++){arr_y[y] = int(y*fh);}for(int x=0; x<w1; x++){arr_x[x] = int(x*fw);}BYTE* pSrc = (BYTE*)src.GetBits();BYTE* pDst = (BYTE*)dst.GetBits();BYTE* p0, *p1;for(int y=0; y<h1; y++){p0 = pSrc + pitch0 * arr_y[y];p1 = pDst + pitch1 * y;for(int x=0; x<w1; x++){//dst.SetPixel(x, y, src.GetPixel(arr_x[x], arr_y[y]));
            memcpy(p1 + 3*x, p0 + arr_x[x]*3, 3);}}delete []arr_x;delete []arr_y;
}

  同样执行示例1中的测试程序,让ResizeNear02也循环一百次,在我机器上测试得到的结果是0.05秒,速度提高了400倍,这是一件多么让人兴奋的事情啊。
 文章出处:http://blog.csdn.net/willian0621/article/details/8685236



CImage实现双缓冲最近邻插值相关推荐

  1. 使用CImage双缓冲

    一普通显示:现在的VC显示图片非常方便,远不是VC6.0那个年代的技术可比,而且支持多种格式的如JPG,PNG. CImage _img; 初始化: _img.Load(L"map.png& ...

  2. Cimage下实现双缓冲绘图

    双缓冲即在内存中创建一个与屏幕绘图区域一致的对象,先将图形绘制到内存中的这个对象上,再一次性将这个对象上的图形拷贝到屏幕上,这样能大大加快绘图的速度. 双缓冲绘图的步骤: 1.在内存中创建与画布一致的 ...

  3. 数字图像处理笔记二 - 图片缩放(最近邻插值(Nearest Neighbor interpolation))

    图片缩放的两种常见算法: 最近邻域内插法(Nearest Neighbor interpolation) 双向性内插法(bilinear interpolation) 本文主要讲述最近邻插值(Near ...

  4. 最近邻插值、双线性插值、双三次插值

    1.最近邻插值 越是简单的模型越适合用来举例子,我们就举个简单的图像:3X3 的256级灰度图,也就是高为3个象素,宽也是3个象素的图像,每个象素的取值可以是 0-255,代表该像素的亮度,255代表 ...

  5. 《MFC游戏开发》笔记六 图像双缓冲技术:实现一个流畅的动画

    本系列文章由七十一雾央编写,转载请注明出处. http://blog.csdn.net/u011371356/article/details/9334121 作者:七十一雾央 新浪微博:http:// ...

  6. 【opencv】最近邻插值、双线性插值、双三次插值(三次样条插值)

    目录 1. 最近邻插值 2. 双线性插值 1)简单理解 2)一般性 3. 双三次插值(三次样条插值) 总结 1. 最近邻插值 举个简单例子:一个3×33 \times 33×3 的单通道图像,如下 如 ...

  7. 双线性内插法最近邻内插法-python(详细)

    在网上找了一圈,没有找到完整且正确的python代码,所以在这里发出来 理论可以直接看一下百度百科:双线性插值 公式很简单,画一下图就知道怎么回事了,简单说就是根据相邻点的远近乘以对应的权重,离得越远 ...

  8. Symbian屏幕双缓冲DSA

    本文作者: 冯兆麟(Simba) (kingsimba@tom.com) 本文献给使用Nokia Symbian 60 SDK各个版本开发游戏软件的程序员.虽然本文主要是针对游戏软件,但是大部分内容对 ...

  9. CV笔记2:图像插值算法—最近邻插值、双线性插值

    目录 一. 简介 二.最近邻插值 三.双线性插值 3.1 线性插值 3.2 双线性插值 3.3 双线性插值的加速及优化策略 参考 一. 简介 在图像处理中,平移变换.旋转变换以及放缩变换是一些基础且常 ...

最新文章

  1. F# ≥ C# (Record)
  2. 把自己的思想记录下来
  3. 深入理解 Kotlin Coroutine (一)
  4. mysql-常用sql
  5. 服务器小白-MYSQL基础安装配置
  6. 用人话解释比特币原理
  7. C语言在工业工程专业的应用,工业工程专业知识介绍
  8. 在oracle 12c上如何禁用haip,以及打开haip,以及对haip的理解
  9. 在线考试系统源码 在线教育源码
  10. windows下安装Linux(Ubuntu)系统
  11. 海思3559A 内置RTC模块调试
  12. HCIA-USG Security Policy
  13. Win10怎么关闭开机启动项
  14. 告别无休止的甩锅,开发和运维如何高效合作
  15. MIT6.824-lab3A-Key/value service without snapshots(基本的KV服务)
  16. 总结今年一些公司的待遇
  17. 累涨超200%成华尔街新宠 Fastly借边缘云有望冲上“云”霄?
  18. 父元素设置min-height,子元素height 100%失效问题
  19. RPC-BDY(2)-注册多个服务
  20. MATLAB软件应用及语法学习基础

热门文章

  1. 后端基础概念:各种OCV一网打尽(上篇)
  2. UVA 1611 Crane
  3. python改变日期的输出格式,关于python:解析日期字符串并更改格式
  4. 拟合三维点平面matlab程序
  5. mysql dba命令_MySQL DBA命令
  6. Latent Semantic Analysis (LSA) Tutorial第一部分(转载)
  7. ORM框架之Spring Data JPA(二)spring data jpa方式的基础增删改查
  8. 数据比赛大杀器----模型融合(stackingblending)(转载)
  9. android中的handler例
  10. 计算机基础与c语言试题及答案,2017年9月计算机二级C语言基础试题及答案