在VC中显示和处理图片的方法





落鹤生 发布于 2011-10-21
09:12 点击:344次 

来自:blog.csdn.net/mengaim_cn

几种用GDI画图的方法介绍。

TAG: GDI




 

法1:这个方法其实用的是一本经典vc图像处理的书上的有关读取位图的函数库,

当没有这个函数库时,就没有太多的实用价值。
这种方法直接用的是读取和显示bmp图片的函数库
首先要得到要显示区域的位置:
  CWnd*
pWnd=GetDlgItem(IDC_BMP);
  RECT
rect;
  pWnd->GetClientRect(&rect);
  CDC*
pDC=pWnd->GetDC();
然后调用函数库
  //获取DIB图像的宽度
  int
cxDIB=(int)::DIBWidth(lpDIB);
  //获取DIB图像的高度
  int
cyDIB=(int)::DIBHeight(lpDIB);
最后也是调用函数库
       
//调用PaintDIB输出图像
 ::PaintDIB(pDC->m_hDC,&rect,m_hDIB,&rcDIB,NULL); 
最要释放资源
               
ReleaseDC(pDC);

--------------------------------------------------------------------------------

法2:
这种方法是直接在屏幕上画图,当然,由于是一点一点的画的,所以,速度会慢些。
首先要得到要显示区域的位置:
  CWnd*
pWnd=GetDlgItem(IDC_BMP);
  CDC*
pDC=pWnd->GetDC();
然后
               
pDC->SetPixel(iw,ih,RGB(r,g,b));
最要释放资源
               
ReleaseDC(pDC);

------------------------------------------------------------------------------------

法3:
这种方法是在内存中开辟一个空间,然后也用SetPixel的方法往内存中写数据,最后可以一次性地把数据显示在屏幕上。当然,从描述上就知道,这种方法比法2要快些,但是,由于使用SetPixel,一个点一个点的写数据,也会有些慢的。

首先要得到要显示区域的位置:
  CWnd*
pWnd=GetDlgItem(IDC_BMP);
  CDC*
pDC=pWnd->GetDC();
然后
 CDC memdc;
 CBitmap
m_bitmap,*m_pOldBitmap;

memdc.CreateCompatibleDC(pDC);
 m_bitmap.CreateCompatibleBitmap(pDC,lWidth,lHeight);
 m_pOldBitmap=memdc.SelectObject(&m_bitmap);
然后,就可以改变内存中的数据了
       
memdc.SetPixel(iw,lHeight-ih,RGB(nrgb,nrgb,nrgb));
将结果显示出来
 pDC->StretchBlt(0,0,rect.right-rect.left,rect.bottom-rect.top,&memdc,
  0,0,lWidth,lHeight,SRCCOPY);
最后释放资源
 memdc.SelectObject(m_pOldBitmap);
 m_bitmap.DeleteObject();
 ReleaseDC(pDC);

-----------------------------------------------------------------------------------

法4:
这种方法挺不错的,一定要好好看看:)
这应该是比法2和法3都快的方法了,因为其是直接在内存中分配一个区域,直接用操作内存区域的方法去操作它,等操作完成后在一次写到屏幕上。
首先,得到要显示的区域
   CWnd*
pWnd=GetDlgItem(IDC_IMG);
   CDC
*theDC=pWnd->GetDC();
   CRect
clientRect;
   pWnd->GetClientRect(clientRect);
然后,写头文件
   BITMAPINFOHEADER
bmiHeader;
   bmiHeader.biSize =
sizeof(BITMAPINFOHEADER);
   bmiHeader.biWidth =
m_width;
   bmiHeader.biHeight =
m_height;
   bmiHeader.biPlanes =
1;
   bmiHeader.biBitCount =
24;
   bmiHeader.biCompression =
BI_RGB;
   bmiHeader.biSizeImage =
0;
   bmiHeader.biXPelsPerMeter =
0;
   bmiHeader.biYPelsPerMeter =
0;
   bmiHeader.biClrUsed =
0;
   bmiHeader.biClrImportant =
0;
现在就可以显示出图像数据在屏幕上了
   // now blast it to the CDC
passed in.
   // lines returns the number of lines
actually displayed
   int lines =
StretchDIBits(theDC->m_hDC,
      left,
top,
      bmiHeader.biWidth,
      bmiHeader.biHeight,
      0,0,
      bmiHeader.biWidth,
      bmiHeader.biHeight,
      tmp,
      (LPBITMAPINFO)&bmiHeader,
      DIB_RGB_COLORS,
      SRCCOPY);
注意呀,其中的tmp的类型是BYTE*
,也就是说其是指向一块内存区首地址,只要这块内存区中放的数据是BMP位图中的数据区的格式,就可以了。也就是说每行元素都是32 bit(4
byte)的整数倍。

有了这种方法,可以说,可以直接用分配内存的函数先分配一个内存区域,然后,用memcpy将一个内存中的内容复制到另一个内存中,对其处理后,再显示出来。

最后别忘了释放资源
   ReleaseDC(theDC);

------------------------------------------------------------------------
另外,获得整个对话框的CDC,不好意思,不知道CDC是什么
  CPaintDC
dc(this);
  CDC *theDC=&dc;

(mengaim_cn)

本站文章除注明转载外,均为本站原创或编译欢迎任何形式的转载,但请务必注明出处,尊重他人劳动,同学习共成长。转载请注明:文章转载自:罗索实验室 [http://www.rosoo.net/a/201110/15172.html]

在VC中显示和处理图片的方法,码迷,mamicode.com

时间: 2024-12-15 01:15:09

在VC中显示和处理图片的方法的相关文章

iOS 程序在UITextView中显示NSLog日志的方法,

最近开发程序,需要做个给测试人员的demo,客户端可以实时 显示程序的打印日志的功能, 查找了很多的资料找到个方法,利用NSPipe即可以实现, 苹果官方解释: objects provide an object-oriented interface for accessing pipes. An NSPipe object represents both ends of a pipe and enables communication through the pipe. A pipe is a

验证码 在resin中显示不出来解决方法 tomcat显示正常

<%@ page contentType="image/jpeg" import="java.awt.*,java.awt.image.*,java.util.*,javax.imageio.*" %> <%! Color getRandColor(int fc,int bc){//给定范围获得随机颜色 Random random = new Random(); if(fc>255) fc=255; if(bc>255) bc=255;

Python的raw_input语句包含中文,在Windows环境CMD中显示乱码的解决方法

Python的raw_input语句中如果包含中文,在Windows环境CMD中执行时会显示乱码: 由于raw_input语句不支持unicode显示,在中文字符串前加u会报错: 解决办法: 在语句中进行强制的编码转换,格式如下: shuzi = raw_input (unicode('请输入日期:','utf-8').encode('gbk'))

VC中显示ICON和BMP图片

显示ICON图标,如下: static HICON hIcon  = (HICON)::LoadImage(       AfxGetInstanceHandle(),        TEXT("1.ico"),       IMAGE_ICON,       0, 0,       LR_DEFAULTCOLOR | LR_CREATEDIBSECTION | LR_LOADFROMFILE);          CClientDC dc(this);       dc.DrawIc

在Centos中显示ipv4地址的方法

输入命令  ifconfig | more eth0网卡只有ipv6 修改方法如下: vi /etc/sysconfig/network-scripts/ifcfg-eth0 ONBOOT=no 改成 yes /etc/init.d/network restart 原文地址:https://www.cnblogs.com/zxq-Study-Java/p/10050861.html

如何在VC中显示透明背景位图

简单的调用系统API. Windows NT/2000/XP: Included in Windows 2000 and later.Windows 95/98/Me: Included in Windows 98 and later.Header: Declared in Wingdi.h; include Windows.h.Library: Use Msimg32.lib. void CTransparentBltTestDlg::OnPaint() { CPaintDC dc(this)

在Delphi中显示Windows图标

栏目刊登了一篇<提取图标的Delphi控件>的文章,所介绍的方法可以用于提取包含在文件中的图标,但对于本身没有包含图标的文件却无法像Windows的“资源管理器”那样显示出其默认的图标.本文介绍了在Delphi的ListView组件中显示这种图标的方法,和<提取图标的Delphi控件>一文结合起来就可以显示出几乎所有的图标了.该方法的一大特色是不用绘制任何图标就能够显示许多Windows图标. 原文来自: [100脚本网 www.pc100.net] ---- 大量的图标显示是Wi

[转]VC++中对文件的写入和读取

本文转自:http://blog.csdn.net/fanghb_1984/article/details/7425705 本文介绍两种方法对文件进行读取和写入操作:1.采用fstream类:2.采用CStdioFile类. CStdioFile继承自CFile,一个CStdioFile对象代表一个用运行时函数fopen 打开的C 运行时流式文件. C++中的fstream类,所有的I/O都以这个“流”类为基础的,包括我们要认识的文件I/O.stream类有两个重要的运算符:插入器(<<)和析

datatable绑定comboBox,在下拉菜单中显示对应数据

实现功能: datatable绑定comboBox,在下拉菜单中显示对应数据 实现方法: 1.生成datatable,并为combox绑定数据源: comboBox1.DataSource = dt1; comboBox1.DisplayMember = "用户编码"; comboBox1.ValueMember = "ID"; this.comboBox1.SelectedIndex = -1; 2.在combox的SelectedIndexChanged事件中添