对CxImage熟悉的同志进来看看。

love514425 2010-08-16 04:00:36
//m_pxImage为CxImage*
Draw的最后一个参数为平滑处理,为什么开启平滑处理后,Draw的数据巨慢,达到14秒钟.
大家有什么解决办法没有呢?
m_pxImage->Draw(dc,m_rcThumbnail,NULL,m_bSmooth);
...全文
355 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
love514425 2010-08-17
  • 打赏
  • 举报
回复
> 以前没搞个图像处理这方面的开发,现在的工作突然要我搞这个,真挺郁闷的。
> 大家有什么好的建议都说说啊,分绝对不是问题。
love514425 2010-08-17
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 lwjnadaxgo 的回复:]

加我QQ340440056 - - 缩小的话你开不开锯齿根本看不出来 我做过测试 缩小的比较小的时候 2插值 3插值 和近邻没啥区别
[/Quote]
> 嗯,已经加你了。
> 但是我这边就是因为缩小显示所以出现模糊和锯齿的情况。
lwjnadaxgo 2010-08-16
  • 打赏
  • 举报
回复
加我QQ340440056 - - 缩小的话你开不开锯齿根本看不出来 我做过测试 缩小的比较小的时候 2插值 3插值 和近邻没啥区别
love514425 2010-08-16
  • 打赏
  • 举报
回复
> 谢谢lwjnadaxgo的回答
> 160K只是一张随即图片而已,不代表以后所有的图片都只有这么大。
> 图片缩放到再小也要做到没有锯齿,显示不模糊吧,要不然怎么接受客户的检验呢。
love514425 2010-08-16
  • 打赏
  • 举报
回复
> lwjnadaxgo 可否留个联系方式,聊聊。
lwjnadaxgo 2010-08-16
  • 打赏
  • 举报
回复
我也在做CXIMAGE 的 他平滑的插值算法很老,你不开平滑照样慢,CX的平滑效果很不错,插值本来就是模糊尽量消除锯齿,这么说你自己 不可能写出来着算法,要么你用API的DIBTS速度不错 效果还行。160K还优化个毛啊 我那分辨都是15000*8000 你那分辨低还要锯齿没有 还要不模糊。
love514425 2010-08-16
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 xiuxianshen 的回复:]
引用楼主 love514425 的回复:
//m_pxImage为CxImage*
Draw的最后一个参数为平滑处理,为什么开启平滑处理后,Draw的数据巨慢,达到14秒钟.
大家有什么解决办法没有呢?
m_pxImage->Draw(dc,m_rcThumbnail,NULL,m_bSmooth);

14S,你多大的图像啊?
[/Quote]
> 160多K。
love514425 2010-08-16
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 xq830210 的回复:]
CxImage::Draw函数中如果平滑,会执行这样一段代码


C/C++ code
if (bSmooth)
{
if (fx > 1 && fy > 1)
{
c = GetAreaColorInterpolated(dx - 0.5f, dy - 0.5f, fx, fy, CxImage::IM_BILINEAR, CxImage::OM_REPEAT……
[/Quote]
有什么办法改善吗?
love514425 2010-08-16
  • 打赏
  • 举报
回复

void CtestDrawDlg::ZoomOutShow()
{
BOOL bRet = m_pxImage->Load(m_lpFilePath,CXIMAGE_FORMAT_JPG|CXIMAGE_FORMAT_BMP); //读取原图
if(!bRet)
{
return ;
}
GetDisplayRect();
Invalidate(FALSE);
}


void CtestDrawDlg::GetDisplayRect()
{
//RC_HEIGHT、RC_WIDTH分别为显示区域的高度和宽度
//PIC_HEIGHT、PIC_WIDTH分别为图片的实际的高度和宽度
if (RC_WIDTH < RC_HEIGHT)
{
long h = (long)(RC_HEIGHT - PIC_HEIGHT/(PIC_WIDTH/(RC_WIDTH*1.0)))>>1;
h = h>0?h:0;
m_rcThumbnail.left = 0;
m_rcThumbnail.right = m_rcShow.right - m_rcShow.left;
m_rcThumbnail.top = 0 + h;
m_rcThumbnail.bottom = m_rcShow.bottom - m_rcShow.top - h;
}
else
{
long w = (long)(RC_WIDTH - PIC_WIDTH/(PIC_HEIGHT/(RC_HEIGHT*1.0)))>>1;
w = w>0?w:0;
m_rcThumbnail.top = 0;
m_rcThumbnail.bottom = m_rcShow.bottom - m_rcShow.top;
m_rcThumbnail.left = 0 + w;
m_rcThumbnail.right = m_rcShow.right - m_rcShow.left - w;
}

}


OnPaint里面
m_pxImage->Draw(dc,m_rcThumbnail,NULL,m_bSmooth);

大家帮看看GetDisplayRect()里面m_rcThumbnail的计算是否有问题,因为如果按照m_rcThumbnail这个rect来绘制图片的话,
不管用微软的IImage还是CxImage都有很明显的锯齿和显示模糊的情况,分不是问题。
xiuxianshen 2010-08-16
  • 打赏
  • 举报
回复
[Quote=引用楼主 love514425 的回复:]
//m_pxImage为CxImage*
Draw的最后一个参数为平滑处理,为什么开启平滑处理后,Draw的数据巨慢,达到14秒钟.
大家有什么解决办法没有呢?
m_pxImage->Draw(dc,m_rcThumbnail,NULL,m_bSmooth);
[/Quote]
14S,你多大的图像啊?
zhouzhipen 2010-08-16
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 love514425 的回复:]
引用 1 楼 zhouzhipen 的回复:
那当然了,平滑处理本来就是一个费时的运算,如果对速度要求太高可以不开启平滑,而且如果你觉得太慢了,可以自己写一个算法来处理,反正人家都是开源的东西。

我们的图片在显示的时候是按照一定的比例来进行缩放,如果按普通的Draw的方式来做的话,会很模糊和有锯齿。
所以,就想到了用平滑处理。
自己写平滑处理算法,没这方面的经验,还望多多指教。
[/Quote]

那你就去看看CxImage中的源码,看看有什么需要优化的,优化一下,不然真没有什么更好的办法了。
比如源码是用C写的,你用汇编,多用用现代CPU的多媒体指令。
Normandie007 2010-08-16
  • 打赏
  • 举报
回复
CxImage::Draw函数中如果平滑,会执行这样一段代码

if (bSmooth)
{
if (fx > 1 && fy > 1)
{
c = GetAreaColorInterpolated(dx - 0.5f, dy - 0.5f, fx, fy, CxImage::IM_BILINEAR, CxImage::OM_REPEAT);
}
else
{
c = GetPixelColorInterpolated(dx - 0.5f, dy - 0.5f, CxImage::IM_BILINEAR, CxImage::OM_REPEAT);
}
}


显然,用的是双线性插值的平滑算法,如果你的图像很大,那处理的时间必然会很长
m_tornado 2010-08-16
  • 打赏
  • 举报
回复
是整个图片平滑处理么?
能否考虑只把放大的部分区域平滑处理,这样比较省~
love514425 2010-08-16
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 zhouzhipen 的回复:]
那当然了,平滑处理本来就是一个费时的运算,如果对速度要求太高可以不开启平滑,而且如果你觉得太慢了,可以自己写一个算法来处理,反正人家都是开源的东西。
[/Quote]
我们的图片在显示的时候是按照一定的比例来进行缩放,如果按普通的Draw的方式来做的话,会很模糊和有锯齿。
所以,就想到了用平滑处理。
自己写平滑处理算法,没这方面的经验,还望多多指教。
zhouzhipen 2010-08-16
  • 打赏
  • 举报
回复
那当然了,平滑处理本来就是一个费时的运算,如果对速度要求太高可以不开启平滑,而且如果你觉得太慢了,可以自己写一个算法来处理,反正人家都是开源的东西。

19,468

社区成员

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

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