我们在单文档应用程序中,经常需要将View中的内容保存为各种格式的图片文件,以便打印。乍一看,可能不知道从哪里下手,其实主要就是用到Bitmap的save方法,如:

HDC hmemDC = ::CreateCompatibleDC( hdc );  HBITMAP hBmp = ::CreateCompatibleBitmap( hdc, destRect.Width(),destRect.Height() );HANDLE hOld = ::SelectObject(hmemDC, hBmp);Graphics graphic( hmemDC );//下面进行各种文字、图形、图片的绘制
 …………………………………………….Bitmap bitmap(hBmp, NULL );
CLSID clsID;//保存不同格式的(.jpg,bmp,png)的图片需要不同的CLSID, imageFormat为用户期望保存的图片格式
if (_T("jpg") == imageFormat.MakeLower() )
{GetEncoderClsid(_T("image/jpeg"), &clsID);
}
else if ( _T("bmp") == imageFormat.MakeLower() )
{GetEncoderClsid(_T("image/bmp"), &clsID);
}
else if ( _T("png") == imageFormat.MakeLower() )
{GetEncoderClsid(_T("image/png"), &clsID);
}//保存为图片,strFN为图片保存的路径和文件名
bitmap.Save( strFN, &clsID, NULL );
::SelectObject( hmemDC, hOld );
::DeleteObject( hBmp );
::DeleteDC( hmemDC );

下面重要的就是获取不同图片格式的CLSID,看下面代码:

Int GetEncoderClsid(const TCHAR* format, CLSID* pClsid){UINT num= 0;UINT size= 0;ImageCodecInfo* pImageCodecInfo= NULL;GetImageEncodersSize(&num, &size);if(size== 0){return -1;}pImageCodecInfo= (ImageCodecInfo*)(malloc(size));if(pImageCodecInfo== NULL){return -1;}GetImageEncoders(num, size, pImageCodecInfo);for(UINT j=0; j< num; ++j){if(_tcscmp(pImageCodecInfo[j].MimeType, format)== 0){*pClsid= pImageCodecInfo[j].Clsid;free(pImageCodecInfo);return j;}}free(pImageCodecInfo);return -1;
}

如果是直接打印View中的图片,那么View的OnDraw函数给的pDC指的就是打印机的纸张的尺寸,我们无需做太多的处理,我们只需要将当期View的区域转换到纸张的大小即可,如:

CRect rc;
GetClientRect( &rc );Long width =0,height = 0;
if( pDC->IsPrinting)
{
  int   xLogPixPerInch = pDC->GetDeviceCaps(LOGPIXELSX);  int   yLogPixPerInch = pDC->GetDeviceCaps(LOGPIXELSY);
  //得到设备坐标和逻辑坐标的比例long   xExt = (long)rc.width() * xLogPixPerInch/96;
  long   yExt = (long)rc.height() * yLogPixPerInch/96;  width = xExt;height = yExt;
  //后面使用GDI+进行绘图
  HBITMAP hBmp = ::CreateCompatibleBitmap( pDC->m_hDC, width, height );HANDLE hOld = ::SelectObject(hmemDC, hBmp);Graphics tmp_graff( hmemDC );…………………………………..
  //获取纸张的大小,然后拉伸拷贝
  int iPageWidth = pDC->GetDeviceCaps(HORZRES);
  int iPageHeight = pDC->GetDeviceCaps(VERTRES);::StretchBlt( pDC->m_hDC, 0, 0, iPageWidth, iPageHeight, hmemDC, 0, 0, width, height, SRCCOPY );    ::SelectObject( hmemDC, hOld );::DeleteObject( hBmp );::DeleteDC( hmemDC );}

转载于:https://www.cnblogs.com/RascallySnake/archive/2013/03/07/2948684.html

View内容保存为图片相关推荐

  1. 将HTML5 Canvas的内容保存为图片

    主要思想是借助Canvas自己的API - toDataURL()来实现,整个实现 HTML + JavaScript的代码很简单. [html] view plaincopy <html> ...

  2. CSharpGL(19)用glReadPixels把渲染的内容保存为PNG图片(C#)

    CSharpGL(19)用glReadPixels把渲染的内容保存为PNG图片(C#) 效果图 本文解决了将OpenGL渲染出来的内容保存到PNG图片的方法. 下载 CSharpGL已在GitHub开 ...

  3. 1.关于QT中的Graphics绘图,定时器,动画,将窗口中的内容打印到图片上,打印机,打印预览

     1 新建项目 A  修改pro中的内容如下: HEADERS += \ MyWidget.h SOURCES += \ MyWidget.cpp QT += gui widgets prints ...

  4. MFC 视图-OpenGL场景-CDialogBar三个界面保存为图片

    问题:如图所示的OpenGL场景.View.CDialogBar三个界面的内容保存成图片然后拼合成一张图 思路: 分四步 一.View视图界面保存 利用BitBlt函数将界面拷贝到内存DC中 // 将 ...

  5. WPF将控件保存为图片

    我们很多时候想把软件当前的界面内容保存为图片,在WPF中是非常简单的,RenderTargetBitmap就是专门用来干这个滴,鉴于很多朋友问我这个问题,我特此把相关的源代码在这里展示一下. 先看一下 ...

  6. html canvas保存为图片,在HTML5 Canvas中放入图片和保存为图片的方法

    第一种方式 如果是使用的图片的话,就会涉及到canvas的图片跨域问题,因为canvas是禁止跨域的,如果图像来自其他域,调用toDataURL()会抛出一个错误 需要添加"img.cros ...

  7. 第27节 实例-相机显示的内容抓取保存成图片

    本节需求 经常的,我们需要将相机渲染的内容传给其它的机器或者保存成图片.甚至需要将相机显示的内容进行录制,制作成mp4.其实制作成mp4也是用的图片,将每一帧的图片存下来,使用相关库制作成mp4就可以 ...

  8. 小程序画布画海报保存成图片可以保存实现完整代码

    老规矩先来个效果图: 因为是截图所以会有些模糊,在真机上会比较清晰 下面针对效果图来看看里面都画了什么元素,代码在文章的最后,大家想直接拷代码可以略过这,这里是方便大家理解代码. 首先,咱们的海报有几 ...

  9. framebuffer 保存 bmp图片格式

    最近需要完成一个从framebuffer中进行读取,然后将内存的东西保存为bmp图片格式,我的其他博客内容对framebuffer进行详细的讲解,以及bmp的格式进行详细的讲解. 之前从网上看到了一些 ...

最新文章

  1. Android API Demo程序框架
  2. 开发一次、多端覆盖的开源统一框架
  3. Go runtime的调度器
  4. python爬虫新闻_python爬虫,爬取一系列新闻
  5. ps导出gif颜色不对_PS の手绘《超详细的动态表情包新手绘制指南》
  6. 雷军亲曝小米 10 四大猛料!
  7. Android基于讯飞语音SDK实现语音识别
  8. java 对象的初始化_java 类和对象的初始化
  9. MAC 青花瓷(Charles)爪机HTTPS 抓包
  10. 数据分析流程——业务需求分析
  11. 沪深证券交易机制概述
  12. Android全面屏最大纵横比适配
  13. 串口COM线转USB的console线无法更新驱动
  14. R包SangerSeqR处理ab1数据
  15. Cookie到底是干什么的?
  16. vSphere Client无法连接到Vcenter
  17. PTA 7-139 手机话费
  18. 家用路由器被劫持?如何正确的分析与应对
  19. 【buildroot】buildroot的相关make命令
  20. 好看的代码,千篇一律!难看的代码,卧槽卧槽~

热门文章

  1. 安装CentOS的注意事项
  2. 当有多个设备online时,命令行窗口通过adb连接指定设备方法
  3. 让iis记录nginx反向代理真实ip
  4. 数据绑定--Repeater, DataList, or GridView?
  5. SQLite指南(0) 表和索引的文件存储结构
  6. mysql闩_Oracle闩:Cache Buffers chains
  7. Mysql设置某字段唯一
  8. Linux中,shell脚本调用java程序模板
  9. 阿里云获ITSS最高等级认证:公共云、专有云服务能力双一级...
  10. IntelliJ 通过 Cloud Toolkit 登陆远程服务器终端 Terminal