首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++:优化简单的图像剪切操作...if()语句太多

C++:优化简单的图像剪切操作...if()语句太多
EN

Stack Overflow用户
提问于 2011-03-14 21:03:14
回答 1查看 551关注 0票数 2

我这里的代码是初步的。我专注于剪裁程序。似乎有很多if()语句,我希望有人能有一个聪明的方法来优化这一点。

如果你想知道m_nStride是什么,它是添加到任何给定像素指针以到达其正下方像素的元素数(y + 1,x+ 0)。但无论哪种方式,这对我的问题都无关紧要。

一般的想法是使用坐标左、上、宽和高填充图像的矩形区域(32-bpp)。在坐标会导致该区域越过图像边界的情况下,该区域将被裁剪以适合图像内部,而不是被解释为错误。

代码语言:javascript
复制
void Image::Clear(int nLeft, int nTop, int nWidth, int nHeight, DWORD dwColor)
{
    if(nWidth <= 0) return;
    if(nHeight <= 0) return;
    if(nLeft >= m_nWidth) return;
    if(nTop >= m_nHeight) return;

    if(nLeft < 0)
    {
        nWidth += nLeft;
        if(nWidth <= 0)
            return;
        nLeft = 0;
    }

    if(nTop < 0)
    {
        nHeight += nTop;
        if(nHeight <= 0)
            return;
        nTop = 0;
    }

    if(nLeft + nWidth > m_nWidth)
    {
        nWidth -= ((nLeft + nWidth) - m_nWidth);
        if(nWidth <= 0) 
            return;
    }

    if(nTop + nHeight > m_nHeight)
    {
        nHeight -= ((nTop + nHeight) - m_nHeight);
        if(nHeight <= 0)
            return;
    }

    DWORD *p = m_pBuffer + (m_nStride * nTop) + nLeft;
    for(int y = 0; y < nHeight; y++)
    {
        for(int x = 0; x < nWidth; x++)
            p[x] = dwColor;
        p += m_nStride;
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-03-14 21:52:34

在性能方面,与for循环相比,if开销几乎为零。尽管如此,作为练习,这里有一个检查较少的版本。它首先裁剪边界,然后只需要检查宽度和高度是否为正。

代码语言:javascript
复制
void Image::Clear(int nLeft, int nTop, int nWidth, int nHeight, DWORD dwColor)
{
    if(nLeft < 0)
    {
        nWidth += nLeft;
        nLeft = 0;
    }

    if(nTop < 0)
    {
        nHeight += nTop;
        nTop = 0;
    }

    if(nLeft + nWidth > m_nWidth)
    {
        nWidth = m_nWidth - nLeft;
    }

    if(nTop + nHeight > m_nHeight)
    {
        nHeight = m_nHeight - nTop;
    }

    if(nWidth <= 0) return;
    if(nHeight <= 0) return;

    DWORD *p = m_pBuffer + (m_nStride * nTop) + nLeft;
    for(int y = 0; y < nHeight; y++)
    {
        for(int x = 0; x < nWidth; x++)
            p[x] = dwColor;
        p += m_nStride;
    }
}
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5298917

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档