[英]C++: Optimizing a simple image clipping operation… too many if() statements
我这里的代码是初步的。 我专注于剪辑程序。 似乎有很多if()语句,我希望有人至少可以对此有一个聪明的优化方法。
如果您想知道m_nStride是什么,那就是要添加到任何给定像素指针以到达其正下方像素(y + 1,x + 0)的元素数量。 但是无论哪种方式,这与我的问题都不重要。
通常的想法是使用左,上,宽和高坐标填充图像的矩形区域(32-bpp)。 如果坐标将使该区域越过图像的边界,则该区域将被裁剪以适合图像内部,而不是被解释为错误。
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;
}
}
为了提高性能,与for
循环相比, if
开销实际上为零。 尽管如此,作为练习,这里的检查较少。 它先裁剪边界,然后只需要检查宽度和高度是否为正。
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;
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.