여기에있는 코드는 임시입니다. 나는 클리핑 절차에 중점을 둘 것입니다. if() 문이 많이있는 것처럼 보입니다. 누군가가 이것을 조금씩 최적화하는 영리한 방법이되기를 바랍니다.C++ : 간단한 이미지 클리핑 연산 최적화 ... if() 문이 너무 많습니다.
m_nStride가 무엇인지 궁금하다면, 그 아래에있는 픽셀 (y + 1, x + 0)에 도달하기 위해 주어진 픽셀 포인터에 추가 할 요소의 수입니다. 그러나 어느 쪽이든, 그건 내 질문에 관한 중요하지 않습니다.
일반적인 생각은 좌표 left, top, width 및 height를 사용하여 이미지의 직사각형 영역 (32 비트)을 채우는 것입니다. 좌표로 인해 해당 영역이 이미지의 경계를 넘게되는 경우 오류로 해석되는 대신 이미지 내부에 맞게 영역이 잘립니다. 성능
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;
}
}
어떤 목표로 최적화 하시겠습니까? 공연? 코드 줄? 명쾌함? 대부분? – xan
성능 ... 어쩌면 너무 많은 if() 문을 사용하지 않고 모든 가능성을 테스트하는 더 영리한 방법 일 것입니다. 대부분의 경우 영역을 클리핑 할 필요가 없으므로 낭비되는 코드 일뿐입니다 ...하지만 나도 마찬가지입니다. 클리핑 코드를 사용하지 않는 편이 안전합니다. – TurtleToes