VC++ GDI+将CDC保存为图片文件(bmp、jpg、png)

2023-10-27

int GetEncoderClsid(const wchar_t* 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 (wcscmp(pImageCodecInfo[j].MimeType, format) == 0)
		{
			*pClsid = pImageCodecInfo[j].Clsid;
			free(pImageCodecInfo);
			return j;
		}
	}
	free(pImageCodecInfo);
	return -1;
}

BOOL SaveAs(CDC* pDC, const wchar_t* lpszFilename)
{
	CBitmap* pBitmap = pDC->GetCurrentBitmap();
	BITMAP bmp;
	pBitmap->GetBitmap(&bmp);
	CRect rcClient = CRect(0, 0, bmp.bmWidth, bmp.bmHeight);
	CBitmap screenbitmap;
	screenbitmap.CreateCompatibleBitmap(pDC, rcClient.Width(), rcClient.Height());
	CDC memDC;
	memDC.CreateCompatibleDC(pDC);
	CBitmap *pOldBitmap = memDC.SelectObject(&screenbitmap);
	memDC.SetStretchBltMode(HALFTONE);
	memDC.StretchBlt(0, 0, rcClient.Width(), rcClient.Height(), pDC, 0, 0, rcClient.Width(), rcClient.Height(), SRCCOPY);
	memDC.SelectObject(pOldBitmap);
	Bitmap bitmap((HBITMAP)screenbitmap.GetSafeHandle(), NULL);

	CLSID picClsid;
	CString sFileName = lpszFilename;
	CString sExt = sFileName.Right(3).MakeLower();
	if (sExt == "jpg")
	{
		ULONG encoderQuality = 80; //压缩比例
		EncoderParameters   encoderParameters;
		encoderParameters.Count = 1;
		encoderParameters.Parameter[0].Guid = EncoderQuality;
		encoderParameters.Parameter[0].Type = EncoderParameterValueTypeLong;
		encoderParameters.Parameter[0].NumberOfValues = 1;
		encoderParameters.Parameter[0].Value = &encoderQuality;
		GetEncoderClsid(L"image/jpeg", &picClsid);
		bitmap.Save(lpszFilename, &picClsid, &encoderParameters);
	}
	else if (sExt == "png")
	{
		GetEncoderClsid(L"image/png", &picClsid);
		bitmap.Save(lpszFilename, &picClsid, NULL);
	}
	else if (sExt == "bmp")
	{
		GetEncoderClsid(L"image/bmp", &picClsid);
		bitmap.Save(lpszFilename, &picClsid, NULL);
	}
	else
	{
		DeleteObject(screenbitmap);
		memDC.DeleteDC();
		return FALSE;
	}

	DeleteObject(screenbitmap);
	memDC.DeleteDC();
	return TRUE;
}

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

VC++ GDI+将CDC保存为图片文件(bmp、jpg、png) 的相关文章

  • 多语言版本 UI资源切换

    1 如果窗体资源和源码里面所使用的字符串资源 都已经存在于资源视图里面 则通过下面方式来实现 LANGID lid GetSystemDefaultLangID if 0x0809 lid 英语 0x0809 SetThreadUILang
  • VC++ 控制台程序常用接口

    1 申请一个控制台窗口 如果程序本身是控制台程序 可以不用调用 AllocConsole 2 获取控制台屏幕缓冲区的句柄 HANDLE m hConsole GetStdHandle STD OUTPUT HANDLE 3 设置控制台标题
  • 多语言版本 OPENFILENAME过滤器设置问题

    正常的时候 打开并选择一个文件这样写代码 char szFileName MAX PATH 0 OPENFILENAME ofn memset szFileName 0 MAX PATH memset ofn 0 sizeof ofn of
  • VC++ HBITMAP保存文件

    请先看下面这段代码 BOOL SaveBmp HBITMAP bmp string path FILE f fopen path c str wb if f return 0 BITMAP bmpinfo GetObject bmp siz
  • 图像算法之高斯模糊(灰度图像)

    1 函数定义 高斯模糊 struct stPGMImage GaussianBlur struct stPGMImage image unsigned int radius 2 函数实现 struct stPGMImage Gaussian
  • C++ 结束进程

    有时候进程未正常退出 导致进程列表遗留僵尸进程 程序启动需要杀死这种僵尸进程 include TLHELP32 H void TerminateSelfApplication TCHAR szFileName MAX PATH 0 TCHA
  • VC++ 源码实现通达信公式管理器

    效果图 前段时间 因业务需要 写了这样一个软件 同样的页面已经是第2次写了 第1次大约5年前的事情了 因为代码遗失 于是重新写 页面看似复杂 实现起来非常简单 第一步 参照通达信的公式管理器核心文件TCalc dll 导出资源文件 TCal
  • WTL 界面设计篇(CSkinDialog)

    头文件声明 CSkinDialog h pragma once include
  • OpenSSL RSA加密和解密

    rsa加密的密钥格式常见的有两种 一种是PKCS 1 密钥头为 BEGIN RSA PUBLIC KEY 一种是PKCS 8 密钥头为 BEGIN PUBLIC KEY 以字符串公钥为例 对PKCS 1格式的密钥加载使用的函数是PEM re
  • EasyPR编译指南

    1 下载源码 https github com liuruoze EasyPR Download ZIP或者git https github com liuruoze EasyPR git 将代码解压到硬盘目录下 例如F 车牌识别 Easy
  • VC++ 文件操作封装类

    头文件声明 SysUtils h pragma once include
  • 图像算法之双线性差值算法(灰度图像)

    1 函数定义 双线性差值算法 struct stPGMImage BilinearInterpolation struct stPGMImage image double zoom factor x double zoom factor y
  • CStdioFile扩展(支持Ansi、Unicode、Utf-8等文本格式)

    头文件声明 CStdioFileEx h StdioFileEx h interface for the CStdioFileEx class Version 1 1 23 August 2003 Incorporated fixes fr
  • VC++ 源码实现通达信公式管理器2

    前面我们介绍了如何加载显示公式列表 本篇章介绍如何格式化显示公式内容 常用的CEdit或CRichEdit是不支持这种格式显示的 这里需要借助第三方控件SciLexer 没错 Notepad 就是使用的这个控件 它支持不同的文本内容支持不同
  • QT 中文版信息提示框

    引言 在QT设计UI程序过程中 整套系统都是中文版本 然而信息提示默认只有中文 难免有点小纠结 这里针对QMessageBox稍微做了一点点改进 使其支持完美的中文提示框 调用方式非常简单 只需要将QMessageBox调用地方 改为QSh
  • VC++ FTP文件下传(断点续传)

    include
  • VC++ OpenCV+ZBar二维码识别

    利用OpenCV处理图像的优势 结合ZBar提高二维码识别结果 接口定义 include
  • VC++ CComboBox自绘阶段性总结

    在绘制列表框左侧的时候 本来说是采用的CImageList接口进行绘制 结果发现绘制后的图标不干净 有锯齿或者黑色背景存在 于是采用了GDI 来实现左侧图标的绘制 代码如下 GDI是完全可以通过图像处理彻底解决图标不干净问题的 之前文章有介
  • MetaEditor 编译原理之MQ4文件语法解析

    语法解析 顾名思义就是将一个文件或者一段代码 按照语法结构拆分为一个一个的单词 比如 extern int TakeProfit 50 int start int i 0 while i lt TakeProfit i return i 正
  • VC++ CComboBox自绘(选择下拉列表框)

    效果图 头文件定义 CSWCheckComboBox h pragma once class CSWCheckComboBox public CComboBox DECLARE DYNAMIC CSWCheckComboBox 成员私有结构

随机推荐

  • 人称代词的各种形式与用法

    文章目录 代词的主格宾格 物主代词 人称代词的各种形式 反身代词 代词的主格宾格 主格代词 I he she it you we they 例句 I am a teacher He is a teacher You are teachers
  • Skip List(跳表)

    转载自 lotabout me 正文 跳表 skip list 对标的是平衡树 AVL Tree 是一种 插入 删除 搜索 都是 O log n 的数据结构 跳跃表和二叉查找它最大的优势是原理简单 容易实现 方便扩展 效率更高 因此在一些热
  • 帆软报表FineReport中数据连接之Websphere配置JNDI连接

    以oracle9i数据源制作的模板jndi cpt为例来说明如何在FineReport中的Websphere配置JNDI连接 由于常用服务器的JNDI驱动过大 帆软报表FineReport中没有自带 所以可以采取下面的方法来使用服务器中的J
  • Hg修改username和email(提交代码后显示)

    问题如题 方法如下 hg config edit 参考链接 https www mercurial scm org pipermail mercurial devel 2014 February 056666 html
  • 惠普服务器之开启虚拟化功能吗,VT虚拟化是什么?惠普主板怎么开启VT虚拟化?...

    如果想要对惠普品牌主板开启vt虚拟化技术的话 可以先确认自己的电脑是不是支持vt虚拟化功能 如果可以那么在电脑开机的时候可以使用快捷方式进入BIOS设置 详细内容请见下文 什么是VT虚拟化 Intel Virtualization Tech
  • 关于开源的XML Parser expat的介绍和使用心得

    转自 http blog csdn net exclusivepig article details 4566252 expat是使用C所写的XML解释器 采用流的方式来解析XML文件 并且基于事件通知型来调用分析到的数据 并不需要把所有X
  • 薄膜电阻和厚膜电阻有什么区别?

    简介 厚膜电阻主要是指采用厚膜工艺印刷而成的电阻 薄膜电阻稳定性的老化过程因实现不同电阻值所需的薄膜厚度而不同 因此在整个电阻范围内是可变的 此外 改变最佳薄膜厚度还会严重影响 TCR TCR是一个不容忽视的微小参数 它的单位是ppm 1
  • C语言结构体大小计算(超详细,例子丰富,有图)

    看了网上很多关于结构体大小计算的方法 感觉很多讲的不是很清楚 换一种例子就行不通了 我自己也是查阅了很多资料 并且进行了大量的例子验证 总结了一个很好计算结构体大小的方法 直接无脑以下三步即可 1 找到结构体中最大的成员变量所占的字节数 2
  • Java方法的调用(值传递和引用传递)

    系列文章目录 文章目录 系列文章目录 Java方法的调用 一 静态方法 二 非静态方法 三 实际参数和形式参数 四 值传递和引用传递 1 值传递 2 引用传递 Java方法的调用 一 静态方法 静态方法调用 类名 方法名 二 非静态方法 1
  • 计算机网络——传输层

    这篇文章是计算机网络系列文章的第四篇 计算机网络 物理层 计算机网络 数据链路层 计算机网络 网络层 计算机网络 传输层 计算机网络 应用层 序言 计算机网络中的传输层在当今的社会起到了什么作用 计算机网络中的传输层在通信和数据传输方面起着
  • 用户协议html代码,微信小程序同意用户协议确认投稿页面设计制作开发教程

    bookInfo title 作 者 bookInfo author 感谢上传的图书和题目 参与我们的书城建设 加入图书分类小组 搜索QQ群123456 加入出题小组 搜索QQ群123456 同意遵守树芽读书的 用户协议 修订版 用户协议
  • ST-LINK 调试、连线

    硬件连线 只需要三根线 swclk swdio gnd 调试 1 debug st link setting 2 pork sw 确定 3 utilities st link settings reset and run打钩 Add对应的芯
  • vue之自定义一Tree组件编写

    1 实现注意事项 递归组件是可以在它们 己模板中调 自身的组件 Node vue
  • 《数字集成电路静态时序分析基础》笔记⑤

    欢迎关注个人公众号摸鱼范式 目录 标准单元库 时序库概述 非线性延迟模型 延迟模型 非线性模型 Derating参数 时序模型 组合逻辑 时序单元 线延迟 参考书目 网络课程 数字集成电路静态时序分析基础 的笔记 地址 https www
  • PyCharm安装教程

    目录 一 下载 1 官网 2 下载 二 安装 1 下载完成后 直接点击安装包安装 即可 2 开始安装 然后下一步 3 可以在此处自定义地址 然后下一步 4 选择安装选择 然后下一步 5 点击安装 等待片刻 安装完成 三 配置PyCharm
  • 陶哲轩发新论文了,又是AI帮忙的那种

    丰色 发自 凹非寺量子位 公众号 QbitAI 不到一个月的时间 陶哲轩又一篇论文上线 这次是关于欧拉函数的单调非递减序列 他通过初等论证证明了一个名为M x 函数的渐近式 即随着x增大 M x 的行为趋势 该函数在他之前的一篇博客中有所提
  • 【嵌入式开发基础】git 之 format-patch的使用

    背景介绍 我们在日常的开发中 涉及对第三方源码的修改或在需要将自己的改动给到其他同事时 经常需要将改动打patch后进行处理 这时候我们常直接使用diff命令生成patch文件 然后通过patch进行打对应的patch文件 详细的使用请看这
  • 液晶屏接口 - MIPI

    MIPI 移动行业处理器接口 是Mobile Industry Processor Interface的缩写 MIPI并不是一个单一的接口或协议 而是包含了一套协议和标准 以满足各种子系统 图像子系统 摄像头和显示器 存储子系统 无线子系统
  • 【pytorch函数笔记(二)】torch.nn.Sigmoid()

    import torch nn as nn torch nn Sigmoid 一 sigmoid介绍 sigmoid是激活函数的一种 它会将样本值映射到0到1之间 sigmoid的公式如下 1 1 e
  • VC++ GDI+将CDC保存为图片文件(bmp、jpg、png)

    int GetEncoderClsid const wchar t format CLSID pClsid UINT num 0 UINT size 0 ImageCodecInfo pImageCodecInfo NULL GetImag