2014년 4월 14일 월요일

C# 이미지 흑백 변환 & 이미지 색 반전

현재 프로젝트에 PDF 에서 도면 이미지를 추출하는 작업이 있다.
추출은 어떻게 만들었지만, 이상 하게도 이미지가 흑백이 반전되어 나오는게 아닌가...
acrobatViewer 로 보면 정상적으로 나오니 파일이 이상이 있는것은 아닐거라고 생각하지만...
이것 저것 따질 시간이 없으므로 그냥 색을 반전시켜 처리했다.

[ 원본 ]


// 흑백 변환
private void btnBlack_Click(object sender, EventArgs e)
{
    Color co;
    int Average; //RGB값의 평균

    for (int x = 0; x < img.Width; x++)
    {
       for (int y = 0; y < img.Height; y++)
       {
           co = img.GetPixel(x, y);
           Average = (co.R + co.G + co.B) / 3;

           // R.G.B 를 모두 같은 값으로 지정하면 회색임.
           co = Color.FromArgb(Average, Average, Average);

           img.SetPixel(x, y, co);     // 해당 좌표 픽셀의 컬러값을 변경
       }
    }
}

물론 흑백 사진(그레이스케일 이미지)을 만드는 방법은 여러가지가 있겠지만, 3색 평균을 내는 것이 가장 간단하게 구현가능해서 그걸 적용했다.
단, 이경우 보이는 것은 흑백이지만, 실제로는 3색 정보를 모두 가지고 있는 컬러 이미지 이므로 용량을 줄인다던지 하는 그런 효과는 없음.
(압축 효율이 늘어날테니 조금은 줄겠지만...)


// 색 반전
private void btnBlack2_Click(object sender, EventArgs e)
{
    Color co;
    int colorR = 0;
    int colorG = 0;
    int colorB = 0;

    for (int x = 0; x < img.Width; x++) 
    {
       for (int y = 0; y < img.Height; y++)
       {
           co = img.GetPixel(x, y);
           colorR = co.R ^ 255;   // 255를 XOR 하여 반전된 색상을 만듬.
           colorG = co.G ^ 255;
           colorB = co.B ^ 255;

           co = Color.FromArgb(colorR, colorG, colorB);

           img.SetPixel(x, y, co);     // 해당 좌표 픽셀의 컬러값을 변경
       }
    }
}




색 반전은 단순히 3색의 값을 각각 255 를 XOR 시킴으로 구현이 가능하다.
XOR 방식으므로 색 반전을 시키고, 또다시 XOR 시켜 원래 색으로 복원시키는 것도 가능하다.
단, 주의 할 것은, 어디까지나 수치상으로 대칭점에 있다는 것이지 '보색' 이라는 개념이 아니므로 '보색'을 구하는 것이라면 다른 방식을 찾아 봐야 할것이다.