간단한 팁.
C#에서 GDI+의 Graphics 오브젝트를 사용해서 렌더링을 할 때 사이즈 변경 등의 변형이 일어나면 들쭉날쭉한 도트가 심해지는 현상이 있는데요, 간단하게 InterpolationMode를 설정하여 렌더링 방식을 선택할 수 있네요.

Image img = Image.FromFile("a.jpg");

using (Bitmap bitmap = new Bitmap(img.Width, img.Height))

{

using (Graphics g = Graphics.FromImage(bitmap))

{

        // 드로잉 모드

        g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;

        // 메모리에 렌더링

        g.DrawImage(img, new Rectangle(0, 0, img.Width, img.Height));

// 파일 저장

        bitmap.Save("a.png");

}

}

내친김에 간단한 윈폼 프로젝트를 하나 만들어서 각 모드별 차이점을 찾아봤어요.


이미지를 선택하면 무조건 200 x 200 사이즈로 렌더링 하는데요, 각 모드별로 걸리는 시간도 함께 표시했어요.


각 모드별로 구분이 확실히 되죠? High...시리즈가 확실히 품질이 더 좋지만 리사이즈에 시간이 훨씬 더 걸리죠.


InterpolationMode는 텍스트나 직선이 많이 들어갈 때 더 확실히 차이가 나는데요, High...시리즈는 흐릿하지만 어느 정도 글자를 읽을 수 있게 되죠.


대용량 사진으로 테스트. 가장 시간이 많이 걸리는건 HighQualityBilinear 방식이고요, 계산을 더 할 수록 이미지가 부드러워지는 혹은 흐려지는 경향이 있네요. HighQualityBilinear는 원본 이미지가 너무 뭉개지는 감이 있고요, HighQualityBicubic이 적당해 보여요.

특히 Deepzoom을 사용할 때에는 이미지가 가급적 부드러운 쪽이 더 자연스러운 확대축소 효과를 보여주게 되므로 혹시 Deepzoom을 위한 이미지를 코드로 리사이즈 한다면 부드러우면서도 약간이나마 더 빠른 HighQualityBicubic쪽을 추천해요.

Posted by gongdo

Submit comment.

  1. 키즈 2008.10.22 18:11  comment URL  Edit/Remove  Submit comment.

    큰 도움 되었습니다 :) 감사합니다 ^^

  2. c# 입문자 2009.05.20 18:21  comment URL  Edit/Remove  Submit comment.

    정보 정말 감사 합니다...

    한가지 질물 드릴께 있습니다.

    위와 같은 방법으로 이미지 사이즈를 변경 했습니다.
    이미지는 참으로 깔끔하게 나오더군요 ... 상당히 만족스럽습니다.
    그런데 보정한 이미지를 저장후 브라우저에서 열었더니 이미지가 열리지 안더군요.ㅠㅠ

    gdi+를 이용 렌더링 후 브라우저에서도 열수 있는 방법이 없을까요?

    • Favicon of http://gongdosoft.com BlogIcon 공도 2009.05.21 11:18  comment URL  Modify/Remove

      글쎄요, 저 상태에서 걍 Save하면 파일 저장 문제 없이 될텐데요.
      만약 그 이미지 파일을 일반적인 이미지 뷰어에서 볼 수 없다면 저장 코드 문제겠고, 일반 뷰어에서 보이는데 브라우저에서 안보인다면 브라우저 문제겠죠. 특히나 IE6같은 경우는 투명 PNG의 투명색을 지원하지 않으니까요.

    • c# 입문자 2009.05.21 14:13  comment URL  Modify/Remove

      이미지를 저장할때 Save함수에 이미지포맷을 주니 브라우저에서도 잘 열리더군요 ...
      그냥 저장하는거랑 포맷을 주는거랑 파일을 까보니 데이터가 서러 다르더군요 ... 왜그런진 모르겠쥐만요 ㅠ
      암튼 덕분에 처리를 했습니다..

      좋은하루 보네세요^^