使用 StretchBlt 制作 缩略图标
来源:互联网 发布:win10删除多余的网络2 编辑:程序博客网 时间:2024/05/22 22:50
//获取图片缩略图//hSrcBmp 源位图//cx cy 目标大小(像素)//bkColor 背景色//hDstBmp 目标位图BOOL GetImageThumb(HBITMAP hSrcBmp, int cx, int cy, COLORREF bkColor, HBITMAP *hDstBmp){ BOOL bRet = FALSE; do { if(hSrcBmp == NULL || hDstBmp == NULL) break; //获取原始图片信息 BITMAP bitmap = {0}; if(GetObject(hSrcBmp, sizeof(bitmap), &bitmap) != sizeof(bitmap)) break; //计算坐标 (锁定比例 & 居中显示) int iSrcWidth = bitmap.bmWidth, iSrcHeight = bitmap.bmHeight; double fZoom = min((double)cx/(double)iSrcWidth, (double)cy/(double)iSrcHeight); int iDstWidth = (int)(iSrcWidth * fZoom); int iDstHeight = (int)(iSrcHeight * fZoom); int ixDst = (cx - iDstWidth)/2; int iyDst = (cy - iDstHeight)/2; //创建内存参考DC HDC hRefDC = CreateDC(_T("DISPLAY"), NULL, NULL, NULL); HBITMAP hRefBmp = CreateBitmap(64, 64, 1, 32, NULL); HBITMAP hOldRefBmp = (HBITMAP)SelectObject(hRefDC, hRefBmp); //源图内存DC & 选入源图 HDC hSrcDC = CreateCompatibleDC(hRefDC); HBITMAP hOldSrcBmp = (HBITMAP)SelectObject(hSrcDC, hSrcBmp); //目标内存DC & 选入目标位图 DeleteObject(*hDstBmp); HDC hDstDC = CreateCompatibleDC(hRefDC); *hDstBmp = CreateCompatibleBitmap(hRefDC, cx, cy); HBITMAP hOldDstBmp = (HBITMAP)SelectObject(hDstDC, *hDstBmp); SetStretchBltMode(hDstDC, HALFTONE); //缩放半色调 //填充背景色 HBRUSH hBursh = CreateSolidBrush(bkColor); RECT rcFill = {0, 0, cx, cy}; FillRect(hDstDC, &rcFill, hBursh); DeleteObject(hBursh); hBursh = NULL; //贴图到内存DC StretchBlt(hDstDC, //dst DC ixDst, iyDst, iDstWidth, iDstHeight, //目标位置 hSrcDC, 0, 0, iSrcWidth, iSrcHeight, //源位置 SRCCOPY); //结束清理 SelectObject(hDstDC, hOldDstBmp); DeleteDC(hDstDC); SelectObject(hSrcDC, hSrcBmp); DeleteDC(hSrcDC); SelectObject(hRefDC, hOldRefBmp); DeleteObject(hRefBmp); DeleteDC(hRefDC); bRet = TRUE; } while (0); return bRet;}
//测试用例, 使用CFileDialog 选择图像文件, 在C盘下生成 tThumb.bmp#include <atlimage.h>void CT2DDlg::OnBnClickedButton2(){ // TODO: 在此添加控件通知处理程序代码 CFileDialog dlg(TRUE); if(dlg.DoModal() == IDOK) { CImage srcImage, dstImage; if(srcImage.Load(dlg.GetPathName()) == S_OK) { HBITMAP hDstBmp = NULL; if(GetImageThumb((HBITMAP)srcImage, 64, 64, RGB(255,255,255), &hDstBmp)) { dstImage.Attach(hDstBmp); dstImage.Save(_T("C:\\tThumb.bmp")); dstImage.Detach(); } if(hDstBmp) { DeleteObject(hDstBmp); hDstBmp = NULL; } } }}
0 0
- 使用 StretchBlt 制作 缩略图标
- StretchBlt使用
- 制作网站缩略标志
- StretchBlt()函数使用
- 字符图标如何制作,使用
- 使用Thumbnailator缩略图片
- StretchBlt
- 制作缩略图片,防变形 html,javascript
- 制作网站的缩略logo标志
- [VB.NET]图标缩略(产生固定大小图标)
- Symbian中图标的制作与使用
- VC使用位图和图标制作按钮
- Symbian中图标的制作与使用
- VC使用位图和图标制作按钮
- VC使用位图和图标制作按钮
- Symbian中图标的制作与使用
- VC使用位图和图标制作按钮
- 使用Metro Studio制作Metro样式图标
- HDU 5860 Death Sequence(DP+约瑟夫问题·改)
- 《自动化运维利器之Saltstack和Puppet》
- 一个网站的详细测试方法要求和步骤
- JHDU 5326Work
- maven项目 ***\target\classes\META-INF\MANIFEST.MF (系统找不到指定的路径。)
- 使用 StretchBlt 制作 缩略图标
- js中Object常用方法和属性
- oracle 数据回滚到指定时间点 命令语句
- [美剧赏析] 权力的游戏<Game of Thrones>完全赏析 (3-4)
- HDU 1878欧拉回路
- IP 回顾
- AndroidStudio下JNI开发(easy+1.0)之字符串转换关系
- 内部接口和内部类的区别
- ios各种设备尺寸相对应的像素