IDL/Image Processing

iPhone Wallpapers powered by IDL

이상우_idl 2015. 10. 30. 10:30
728x90
반응형

오늘은 조금 특이한 작업을 해보기로 하겠습니다. 스마트폰의 배경화면을 IDL로 만들어보는 작업인데요. 사실 저는 현재 아이폰 5S를 사용중입니다. 그래서 제 폰에 맞는 배경화면을 만들어보겠습니다. 하지만 오늘 소개할 내용은 화면 크기만 바꾸면 여러분들도 기기에 맞게 만들어 사용하실 수 있습니다.


저는 이번에 출시된 아이폰 6S의 4종의 색상들을 주 테마로 정해봤습니다. 색상들의 이름은 이미 많이 알려진대로 Rose Gold, Space Gray, Gold, Silver 등 4종입니다. 하지만 실제로 이 색상들을 갖고 작업을 하려면 각 색상의 RGB값을 알아야 합니다. 저는 그냥 웹 검색을 통해서 알아봤는데요. 정확할지는 모르겠으나 그냥 이렇게 알아낸 값들을 사용해봤습니다. 이렇게 알아낸 4종의 색상별 RGB값들을 다음과 같이 3X4의 크기를 갖는 배열 하나에 담아보았습니다.


cvs = BYTARR(3, 4)

cvs[*, 0] = [183, 110, 121]; rose gold

cvs[*, 1] = [118, 117, 121]; space gray

cvs[*, 2] = [187, 189, 188]; silver

cvs[*, 3] = [206, 189, 170]; gold


그 다음에는 월페이퍼의 크기로 적당한 540X960 크기의 그래픽창을 띄우고 이 안에 4개의 직사각형들을 정렬해보았습니다. 가로 방향으로 4개의 직사각형들이 있으며 각각이 4종의 색상으로 채워지도록 한 것입니다. 이를 위하여 POLYGON 함수가 사용되었습니다. 이렇게 하면 다음과 같은 그림이 그려집니다. 이 상태로 그림 파일로 저장하면 됩니다.


win1 = WINDOW(DIMENSIONS=[540, 960])

plg1 = POLYGON([0, 0.25, 0.25, 0, 0], [0, 0, 1, 1, 0], $

  COLOR=cvs[*, 0], FILL_COLOR=cvs[*, 0], /NORMAL)

plg2 = POLYGON([0.25, 0.5, 0.5, 0.25, 0.25], [0, 0, 1, 1, 0], $

  COLOR=cvs[*, 1], FILL_COLOR=cvs[*, 1], /NORMAL)

plg3 = POLYGON([0.5, 0.75, 0.75, 0.5, 0.5], [0, 0, 1, 1, 0], $

  COLOR=cvs[*, 2], FILL_COLOR=cvs[*, 2], /NORMAL)

plg4 = POLYGON([0.75, 1, 1, 0.75, 0.75], [0, 0, 1, 1, 0], $

  COLOR=cvs[*, 3], FILL_COLOR=cvs[*, 3], /NORMAL)

win1.Save, 'wallpaper_A.png', WIDTH=540



이번에는 조금 다른게 체커 무늬의 패턴으로 그려보고자 합니다. 이를 위해서는 사각형 4개가 2X2의 격자로 위치하도록 해야 하는데요. 물론 위에서와 같이 각 사각형을 폴리곤으로 하나하나 그리는 방법도 있겠지만, 이번에는 약간 다른 방법을 써서, 2X2의 격자 형태의 배열을 만들고 각 셀마다 색상을 대응시킨 후 IMAGE 함수를 사용하여 마치 이미지를 표출하는 것과 같은 방식으로 구현하는 것입니다. 이 과정은 다음과 같습니다. 그리고 그 결과 그림도 바로 아래에 있습니다.


img = BYTARR(3, 2, 2)

img[*, 0, 0] = cvs[*, 0]

img[*, 0, 1] = cvs[*, 3]

img[*, 1, 0] = cvs[*, 2]

img[*, 1, 1] = cvs[*, 1]

win2 = WINDOW(DIMENSIONS=[540, 960])

im = IMAGE(img, MARGIN=0, ASPECT_RATIO=0, /CURRENT)

win2.Save, 'wallpaper_B.png', WIDTH=540



여기서 이미지로 표출된 배열 자체는 2X2로서 매우 작습니다. 따라서 이를 그대로 픽셀의 크기로 대응시켜서 표출하면 당연히 거의 보이지 않는 크기가 됩니다. 하지만 IMAGE 함수에서 MARGIN이라는 키워드의 값을 0으로 설정하면, 어떻게든 그래픽창의 크기에끼워맞춰서 표출하게 됩니다. 물론 이 경우 화면상으로 보여지는 모습 자체는 마치 커진 것처럼 보이게 되는 효과가 있습니다. 그리고이미지의 가로/세로 크기 비율을 어떻게든 맞춰서 표출하는 것이 기본 설정이기 때문에, 이를 해제하기 위하여 ASPECT_RATIO라는 키워드의 값을 0으로 설정하였습니다. 결론적으로 얘기하면, NG체계의 IMAGE 함수를 잘 이용하여 이러한 효과를 구현하면 됩니다.


또 다른 방법을 소개하면, 위와 같은 체커 무늬가 여러 개가 합쳐진 느낌의 패턴을 만드는 방법도 시도해볼 수 있습니다. 다만 이런 작업을 하려면 img의 크기도 더 커져야 하고, 이 안에 색상들을 제 위치에 배정하기 위한 약간의 기술이 필요합니다. 물론 반복문을 잘 이용하면 이러한 작업을 쉽게 해낼 수 있습니다. 이 과정은 다음과 같습니다. 자세한 설명은 생략하겠습니다. 그리고 이 과정을 통하여 얻어진 결과 그림은 바로 이어서 등장합니다.


sz = 8

img = BYTARR(3, sz, sz)

n = sz / 2

FOR j = 0, n-1 DO BEGIN

  FOR i = 0, n-1 DO BEGIN

    img[*, 0+i*2, 0+j*2] = cvs[*, 0]

    img[*, 0+i*2, 1+j*2] = cvs[*, 3]

    img[*, 1+i*2, 0+j*2] = cvs[*, 2]

    img[*, 1+i*2, 1+j*2] = cvs[*, 1]

  ENDFOR

ENDFOR

win3 = WINDOW(DIMENSIONS=[540, 960])

im = IMAGE(img, MARGIN=0, ASPECT_RATIO=0, /CURRENT)

win3.Save, 'wallpaper_C.png', WIDTH=540



그래서 위 프로그램에서 sz의 값을 4의 배수가 되도록 여러가지 값들을 사용해보면 더 촘촘하고 복잡한 패턴의 그림도 그릴 수 있습니다. 물론 이렇게 그려진 그림은 눈으로 보면 좀 어지러울 수 있다는 점 감안하시기 바랍니다. 다음 그림은 위 프로그램에서 sz의 값을 16으로 해놓고 얻은 그림인데요. 보시다시피 좀 어지럽습니다.



위의 예제코드들에서 그래픽창의 크기는 WINDOW 함수의 DIMENSION 키워드에서 설정 가능하기 때문에 여러분이 원하시는 사이즈로도 얼마든지 그려볼 수 있습니다. 그리고 색상의 순서도 cvs의 두번째 인덱스를 조절하여 얼마든지 바꿔볼 수도 있다는 점 참조하시면 되겠습니다.

반응형