BOOL CDlgTexMan::scale_bitmap(CBitmap* bmpfrom, CBitmap& bmpout, int width, int height, BOOL keep_ratio )
{
//如果已经初始化,则删除之
if(bmpout.GetSafeHandle())
{
bmpout.DeleteObject();
}
if(keep_ratio)
{
BITMAP bmfrom;
bmpfrom->GetBitmap(&bmfrom);
CDC dcfrom;
dcfrom.CreateCompatibleDC(0);
CBitmap* old_from_bmp = dcfrom.SelectObject(bmpfrom);
CDC dcto;
dcto.CreateCompatibleDC(0);
bmpout.CreateCompatibleBitmap(&dcfrom, width, height);
CBitmap* old_bmp = dcto.SelectObject(&bmpout);
dcto.SetStretchBltMode(COLORONCOLOR);
float old_ratio = (float)bmfrom.bmWidth / bmfrom.bmHeight;
float dst_ratio = (float)width/height;
//奇怪,在release模式下,即使两个图大小相同,上面算出来的float也不会相等
//所以,必须用isequal来误差判断!!!
if( IsEqual(dst_ratio, old_ratio) )
{
dcto.StretchBlt(0,0,width,height,&dcfrom,0,0,bmfrom.bmWidth,bmfrom.bmHeight,SRCCOPY);
}
else if(old_ratio>dst_ratio)//长宽比不一样的处理
{
int new_width = width;
int new_height = (int)(width / old_ratio);
int offx = 0;
int offy = (height - new_height)/2;
//空隙处填充client颜色
COLORREF color = ::GetSysColor(COLOR_WINDOW);
dcto.FillSolidRect(0,0,width,offy, color);
dcto.FillSolidRect(0, offy+new_height,width,offy+1, color);
dcto.StretchBlt(offx,offy,new_width,new_height,&dcfrom,0,0,bmfrom.bmWidth,bmfrom.bmHeight,SRCCOPY);
}
else if(old_ratio<dst_ratio)
{
int new_height = height;
int new_width = (int)(new_height * old_ratio);
int offx = (width - new_width)/2;
int offy = 0;
//空隙处填充client颜色
COLORREF color = ::GetSysColor(COLOR_WINDOW);
dcto.FillSolidRect(0,0,offx,height, color);
dcto.FillSolidRect(offx+new_width,0,offx+1,height, color);
dcto.StretchBlt(offx,offy,new_width,new_height,&dcfrom,0,0,bmfrom.bmWidth,bmfrom.bmHeight,SRCCOPY);
}
dcto.SelectObject(old_bmp);
dcfrom.SelectObject(old_from_bmp);
return true;
}
else
{
BITMAP bmfrom;
bmpfrom->GetBitmap(&bmfrom);
CDC dcfrom;
dcfrom.CreateCompatibleDC(0);
CBitmap* old_from_bmp = dcfrom.SelectObject(bmpfrom);
CDC dcto;
dcto.CreateCompatibleDC(0);
bmpout.CreateCompatibleBitmap(&dcfrom, width, height);
CBitmap* old_bmp = dcto.SelectObject(&bmpout);
dcto.SetStretchBltMode(COLORONCOLOR);
dcto.StretchBlt(0,0,width,height,&dcfrom,0,0,bmfrom.bmWidth,bmfrom.bmHeight,SRCCOPY);
dcto.SelectObject(old_bmp);
dcfrom.SelectObject(old_from_bmp);
return true;
}
}
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
scale_bitmap.rar (1个子文件)
scale_bitmap.cpp 2KB
共 1 条
- 1
资源评论
weixin_42651887
- 粉丝: 75
- 资源: 1万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功