VC编程之vc++ mfc 里保存缩放的bmp图片 不失真
小标 2018-11-15 来源 : 阅读 1123 评论 0

摘要:本文主要向大家介绍了VC编程之vc++ mfc 里保存缩放的bmp图片 不失真,通过具体的内容向大家展示,希望对大家学习VC编程有所帮助。

本文主要向大家介绍了VC编程之vc++ mfc 里保存缩放的bmp图片 不失真,通过具体的内容向大家展示,希望对大家学习VC编程有所帮助。

VC编程之vc++ mfc 里保存缩放的bmp图片 不失真

mamicode_adload('content_before');

void CSaveView::OnFileSave() 
{
 BITMAP info;//原始图片
 m_bitmap.GetBitmap(&info);
 CDC DC1;
 DC1.CreateCompatibleDC(NULL);
 DC1.SelectObject(&m_bitmap);
 
 DC1.MoveTo(0,0);
 DC1.LineTo(info.bmWidth,info.bmHeight);
 
 CDC DC2;
 CBitmap bmp;//缩放后的图片
 bmp.CreateCompatibleBitmap(&DC1,200,200);
 DC2.CreateCompatibleDC(NULL);
 DC2.SelectObject(&bmp);
 int mode = SetStretchBltMode(DC2, COLORONCOLOR); //设置不失真缩放
 DC2.StretchBlt(0,0,200,200,&DC1,0,0,info.bmWidth,info.bmHeight,SRCCOPY);
 SetStretchBltMode(DC2, mode); 

 CFileDialog dlg(false,"bmp",NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,NULL,this);
 if(IDOK == dlg.DoModal())
 {
      CString bmpfile = dlg.GetPathName();     
        CFile file(bmpfile,CFile::modeCreate|CFile::modeWrite);       
        BITMAP bInfo;     
     bmp.GetBitmap(&bInfo);
        //计算调色板大小      
        int panelsize = 0;     
        if (bInfo.bmBitsPixel<24) //非真彩色      
        {     
            panelsize = int(pow((double)2,bInfo.bmBitsPixel)*sizeof(RGBQUAD));
        }     
  
        //定义位图信息      
        BITMAPINFO*  bMapInfo = (BITMAPINFO*)LocalAlloc(LPTR,sizeof(BITMAPINFOHEADER)+panelsize);     
        bMapInfo->bmiHeader.biBitCount = bInfo.bmBitsPixel;     
        bMapInfo->bmiHeader.biClrImportant = 0;     
        bMapInfo->bmiHeader.biCompression = 0;     
        bMapInfo->bmiHeader.biHeight = bInfo.bmHeight;     
        bMapInfo->bmiHeader.biPlanes = bInfo.bmPlanes;     
        bMapInfo->bmiHeader.biSize = sizeof(BITMAPINFO);     
        bMapInfo->bmiHeader.biSizeImage = bInfo.bmHeight*bInfo.bmWidthBytes;     
        bMapInfo->bmiHeader.biWidth = bInfo.bmWidth;     
        bMapInfo->bmiHeader.biXPelsPerMeter = 0;     
        bMapInfo->bmiHeader.biYPelsPerMeter = 0;     
  
        //获取位图的实际数据      
        char* pData = new char[bMapInfo->bmiHeader.biSizeImage];     
     int len = GetDIBits(DC2.m_hDC,bmp,0,bInfo.bmHeight,pData,bMapInfo,DIB_RGB_COLORS); 
  
        BITMAPFILEHEADER bFileHeader;     
        bFileHeader.bfType = 0x4D42;     
        bFileHeader.bfReserved1 = 0;     
        bFileHeader.bfReserved2 = 0;     
        bFileHeader.bfSize = sizeof(BITMAPFILEHEADER);      
        bFileHeader.bfOffBits = sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+panelsize;   
  
        //向文件中写入位图数据      
        file.Write(&bFileHeader,sizeof(BITMAPFILEHEADER));     
        file.Write(&bMapInfo->bmiHeader,sizeof(BITMAPINFOHEADER));     
        file.Write(pData,bMapInfo->bmiHeader.biSizeImage+panelsize);     
        file.Close();     
        delete pData;     
        LocalFree(bMapInfo);     
  } 
}

以上就介绍了VC/MFC的学习,希望对VC/MFC有兴趣的朋友有所帮助。了解更多内容,请关注职坐标编程语言VC/MFC频道!

本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 1 不喜欢 | 0
看完这篇文章有何感觉?已经有1人表态,100%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程