View内容保存为图片
我们在单文档应用程序中,经常需要将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内容保存为图片相关推荐
- 将HTML5 Canvas的内容保存为图片
主要思想是借助Canvas自己的API - toDataURL()来实现,整个实现 HTML + JavaScript的代码很简单. [html] view plaincopy <html> ...
- CSharpGL(19)用glReadPixels把渲染的内容保存为PNG图片(C#)
CSharpGL(19)用glReadPixels把渲染的内容保存为PNG图片(C#) 效果图 本文解决了将OpenGL渲染出来的内容保存到PNG图片的方法. 下载 CSharpGL已在GitHub开 ...
- 1.关于QT中的Graphics绘图,定时器,动画,将窗口中的内容打印到图片上,打印机,打印预览
1 新建项目 A 修改pro中的内容如下: HEADERS += \ MyWidget.h SOURCES += \ MyWidget.cpp QT += gui widgets prints ...
- MFC 视图-OpenGL场景-CDialogBar三个界面保存为图片
问题:如图所示的OpenGL场景.View.CDialogBar三个界面的内容保存成图片然后拼合成一张图 思路: 分四步 一.View视图界面保存 利用BitBlt函数将界面拷贝到内存DC中 // 将 ...
- WPF将控件保存为图片
我们很多时候想把软件当前的界面内容保存为图片,在WPF中是非常简单的,RenderTargetBitmap就是专门用来干这个滴,鉴于很多朋友问我这个问题,我特此把相关的源代码在这里展示一下. 先看一下 ...
- html canvas保存为图片,在HTML5 Canvas中放入图片和保存为图片的方法
第一种方式 如果是使用的图片的话,就会涉及到canvas的图片跨域问题,因为canvas是禁止跨域的,如果图像来自其他域,调用toDataURL()会抛出一个错误 需要添加"img.cros ...
- 第27节 实例-相机显示的内容抓取保存成图片
本节需求 经常的,我们需要将相机渲染的内容传给其它的机器或者保存成图片.甚至需要将相机显示的内容进行录制,制作成mp4.其实制作成mp4也是用的图片,将每一帧的图片存下来,使用相关库制作成mp4就可以 ...
- 小程序画布画海报保存成图片可以保存实现完整代码
老规矩先来个效果图: 因为是截图所以会有些模糊,在真机上会比较清晰 下面针对效果图来看看里面都画了什么元素,代码在文章的最后,大家想直接拷代码可以略过这,这里是方便大家理解代码. 首先,咱们的海报有几 ...
- framebuffer 保存 bmp图片格式
最近需要完成一个从framebuffer中进行读取,然后将内存的东西保存为bmp图片格式,我的其他博客内容对framebuffer进行详细的讲解,以及bmp的格式进行详细的讲解. 之前从网上看到了一些 ...
最新文章
- Android API Demo程序框架
- 开发一次、多端覆盖的开源统一框架
- Go runtime的调度器
- python爬虫新闻_python爬虫,爬取一系列新闻
- ps导出gif颜色不对_PS の手绘《超详细的动态表情包新手绘制指南》
- 雷军亲曝小米 10 四大猛料!
- Android基于讯飞语音SDK实现语音识别
- java 对象的初始化_java 类和对象的初始化
- MAC 青花瓷(Charles)爪机HTTPS 抓包
- 数据分析流程——业务需求分析
- 沪深证券交易机制概述
- Android全面屏最大纵横比适配
- 串口COM线转USB的console线无法更新驱动
- R包SangerSeqR处理ab1数据
- Cookie到底是干什么的?
- vSphere Client无法连接到Vcenter
- PTA 7-139 手机话费
- 家用路由器被劫持?如何正确的分析与应对
- 【buildroot】buildroot的相关make命令
- 好看的代码,千篇一律!难看的代码,卧槽卧槽~
热门文章
- 安装CentOS的注意事项
- 当有多个设备online时,命令行窗口通过adb连接指定设备方法
- 让iis记录nginx反向代理真实ip
- 数据绑定--Repeater, DataList, or GridView?
- SQLite指南(0) 表和索引的文件存储结构
- mysql闩_Oracle闩:Cache Buffers chains
- Mysql设置某字段唯一
- Linux中,shell脚本调用java程序模板
- 阿里云获ITSS最高等级认证:公共云、专有云服务能力双一级...
- IntelliJ 通过 Cloud Toolkit 登陆远程服务器终端 Terminal