+ -
当前位置:首页 → 问答吧 → VC图像处理的问题

VC图像处理的问题

时间:2010-08-10

来源:互联网



将一副图片全屏显示时,考虑到显示的效果美观,对图片的显示位置进行了计算(计算最佳位置)
其中RC_WIDTH为显示区域的宽度,RC_HEIGHT为显示区域的高度
PIC_WIDTH,PIC_HEIGHT分别为图片的宽度和高度
m_rcThumbnail为最终的显示区域

C/C++ code

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;
}


问题: 
用这种算法计算并显示图片后,显示的图片出现了毛边,大家有什么办法吗?
用了CxImage的平滑处理,
 long CxImage::Draw ( HDC hdc,  
  const RECT & rect,  
  RECT * pClipRect = NULL,  
  bool bSmooth = false //此参数置为TRUE为平滑处理
 ) 
 用了后效果要好很多,但是速度其慢,显示图片大概要3-5秒左右。
 各位有什么建议没啊?

作者: love514425   发布时间: 2010-08-10

不是经常变化的话,可以考虑先计算好了存放在内存中,然后每次需要的时候直接画............................

作者: dirdirdir3   发布时间: 2010-08-10

引用 1 楼 dirdirdir3 的回复:
不是经常变化的话,可以考虑先计算好了存放在内存中,然后每次需要的时候直接画............................

嗯,放到内存中也会出现毛边啊。

作者: love514425   发布时间: 2010-08-10

> 请大家多给点建议,分不是问题。

作者: love514425   发布时间: 2010-08-10

是说把你的平滑处理放到内存里:
long CxImage::Draw ( HDC hMemdc, // 这里用一个MemDC,画到一个内存位图中。
  const RECT & rect,  
  RECT * pClipRect = NULL,  
  bool bSmooth = false //此参数置为TRUE为平滑处理
 )

以后就直接用这个内存位图往屏幕上贴(BitBlt)就行了。

作者: xxd_qd   发布时间: 2010-08-10

引用 4 楼 xxd_qd 的回复:
是说把你的平滑处理放到内存里:
long CxImage::Draw ( HDC hMemdc, // 这里用一个MemDC,画到一个内存位图中。
const RECT &amp; rect,
RECT * pClipRect = NULL,
bool bSmooth = false //此参数置为TRUE为平滑处理
)

以后就直接用这个内存位图往屏幕上贴(B……

那第一次也会慢啊。

作者: love514425   发布时间: 2010-08-10

> 而且那样的话每张图片都要对应一个MemDC,我是在想能平滑处理的速度能不能快点?

作者: love514425   发布时间: 2010-08-10

> UP

作者: love514425   发布时间: 2010-08-10

引用 6 楼 love514425 的回复:
> 而且那样的话每张图片都要对应一个MemDC,我是在想能平滑处理的速度能不能快点?

在MemDC里画完以后,可以通过SelectObject(pOldBitmap)把画好的Bitmap换出来,然后就可以DeleteDC了,下次贴图的时候再重新生成MemDC。不过不管怎么说,每张图片都要对应一个hBitmap是起码的。

至于说平滑处理的速度能不能快点,那看你的算法如何了,但要说3~5秒实在有点夸张,要么你的CPU是20年前的古董,要么你的图像有100000 * 100000这么大,如果都不是的话,我就不太明白这3~5秒时间都去干什么了?

作者: xxd_qd   发布时间: 2010-08-10

引用 8 楼 xxd_qd 的回复:
引用 6 楼 love514425 的回复:
> 而且那样的话每张图片都要对应一个MemDC,我是在想能平滑处理的速度能不能快点?

在MemDC里画完以后,可以通过SelectObject(pOldBitmap)把画好的Bitmap换出来,然后就可以DeleteDC了,下次贴图的时候再重新生成MemDC。不过不管怎么说,每张图片都要对应一个hBitmap是起码的。

至于说平滑处理的速……

> 谢谢xxd_qd的回复,我们的设备是嵌入式设备,硬件条件肯定是不同于PC机的。
  你对双线性插值算法熟悉吗? 可以实现去锯齿吗?

作者: love514425   发布时间: 2010-08-10

热门下载

更多