CImage 缩放后的png,有的背景是黑的?

Sterntaler 2012-11-28 05:19:47
至于绘画的方法,Draw, AlphaBlend, StrechBlt 都尝试了,效果一样。
那几个透明正常的图片,也没看出来属性和其他的有什么不一样。

void StretchImage( CImage &image, int width, int height, CBitmap &bitmap )
{
CImage memImage;
memImage.Create(width, height, 32);

float oriWidth = image.GetWidth(), oriHeight = image.GetHeight();
float scale = MIN(width / oriWidth, height / oriHeight);

image.Draw(memImage.GetDC(), 0, 0, oriWidth * scale, oriHeight * scale);
memImage.ReleaseDC();

HBITMAP hBitmap = memImage.Detach();
bitmap.Attach(hBitmap);
}
...全文
446 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
Sterntaler 2012-12-27
  • 打赏
  • 举报
回复
但是直接用 TransparentBlt 又没为题:
image.TransparentBlt(hdc, 200 + (width - scaledW) / 2, (height - scaledH) / 2, scaledW, scaledH, 0);


Sterntaler 2012-12-27
  • 打赏
  • 举报
回复
新建个MFC的项目,然后直接用CImage 显示那些图片都没问题的。问题出在缩放上面。
也就是说下面的代码,image.Draw(hdc, 0, 0); 是透明正常的,但是 memImage.Draw(hdc, 200, 0); 就黑了


	image.Draw(hdc, 0, 0);

image.TransparentBlt(memImage.GetDC(), (width - scaledW) / 2, (height - scaledH) / 2, scaledW, scaledH, 0);
memImage.ReleaseDC();

memImage.Draw(hdc, 200, 0);


傻X 2012-12-26
  • 打赏
  • 举报
回复
TransparenBlt把黑色过滤输出看看效果 或者看看我昨天的帖子 帖子 2楼
jimette 2012-12-26
  • 打赏
  • 举报
回复
fillrect 刷白色就好了! 求大牛把!
Sterntaler 2012-12-26
  • 打赏
  • 举报
回复
引用 4 楼 sha_jinhao 的回复:
dc默认色是黑的!
有办法透明嘛。通过像素操作倒是可以改成其他颜色,就是改变alpha值没有变化。不过如图所示,有的图片还是透明显示了的?
void CImagePane::StretchImage( CImage &image, int width, int height, CBitmap &bitmap )
{
	CImage memImage;
	memImage.Create(width, height, 32);

	float oriWidth = image.GetWidth(), oriHeight = image.GetHeight();
	float scale = MIN(width / oriWidth, height / oriHeight);
	float scaledW = oriWidth * scale;
	float scaledH = oriHeight * scale;

	image.StretchBlt(memImage.GetDC(), (width - scaledW) / 2, (height - scaledH) / 2, scaledW, scaledH);
	memImage.ReleaseDC();

	HBITMAP hBitmap = memImage.Detach();
	bitmap.Attach(hBitmap);
}
		StretchImage(image, PHY_TEMPLATE_ACTOR_ICON_SIZE, PHY_TEMPLATE_ACTOR_ICON_SIZE, bitmap);

		m_imgList.Add(&bitmap, RGB(0, 0, 0));
Sterntaler 2012-12-26
  • 打赏
  • 举报
回复
还没有呢。。现在用TransparentBlt 缩小后的图标比之前平滑点儿了。
jimette 2012-12-26
  • 打赏
  • 举报
回复
lz 解决了吗?
Sterntaler 2012-12-26
  • 打赏
  • 举报
回复
image.TransparentBlt(memImage.GetDC(), (width - scaledW) / 2, (height - scaledH) / 2, scaledW, scaledH, 0);
最后一个参数,只要不是-1 效果都一样(默认值-1会触发assert)
Sterntaler 2012-12-26
  • 打赏
  • 举报
回复
用CImage::Transparenblt() 的话缩小效果比之前的 StretchBlt 好,但是用什么透明色呢?
Sterntaler 2012-12-26
  • 打赏
  • 举报
回复
引用 11 楼 tiger9991 的回复:
我另外一个方法是保存在透明通道的文件。 做实验获得系统默认处理透明颜色的RGB(不一定是黑色),然后Transparenblt过滤这个函数 显示的透明我觉得处理起来还真简单呢。
我觉得这玩意儿本来就应该特简单啊,怎么跟MFC扯上点儿关系就变得复杂了 事实上我是用ListView来显示缩略图的,相关的代码如下:
		CImage image;
		CBitmap bitmap;
		image.Load("some_image.png");

		StretchImage(image, PHY_TEMPLATE_ACTOR_ICON_SIZE, PHY_TEMPLATE_ACTOR_ICON_SIZE, bitmap);

		m_imgList.Add(&bitmap, RGB(0, 0, 0));
傻X 2012-12-26
  • 打赏
  • 举报
回复
我另外一个方法是保存在透明通道的文件。 做实验获得系统默认处理透明颜色的RGB(不一定是黑色),然后Transparenblt过滤这个函数 显示的透明我觉得处理起来还真简单呢。
Sterntaler 2012-12-26
  • 打赏
  • 举报
回复
引用 7 楼 tiger9991 的回复:
TransparenBlt把黑色过滤输出看看效果 或者看看我昨天的帖子 帖子 2楼
《用CImage显示透明》那篇文章的方法用过了,没有作用。 另外一个方法里面,CImage::SetHasAlphaChannel() 有这个方法的吗?
Sterntaler 2012-12-26
  • 打赏
  • 举报
回复
引用 7 楼 tiger9991 的回复:
TransparenBlt把黑色过滤输出看看效果 或者看看我昨天的帖子 帖子 2楼
你意思是那些PNG本身不带透明通道哇。我试试看。
Sterntaler 2012-12-26
  • 打赏
  • 举报
回复
引用 6 楼 sha_jinhao 的回复:
fillrect 刷白色就好了! 求大牛把!
白了也不行,你懂的
jimette 2012-12-21
  • 打赏
  • 举报
回复
dc默认色是黑的!
Sterntaler 2012-12-18
  • 打赏
  • 举报
回复
沉底了
Sterntaler 2012-11-28
  • 打赏
  • 举报
回复
image.Draw 应为 StretchBlt,Draw() 的话全不透明,还是有差别
Sterntaler 2012-11-28
  • 打赏
  • 举报
回复

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧