소스코드에는 smarty라는 문자와 이미지 파일 외에는 어떠한 힌트도 없습니다.
평소 파워포인트나 디자인을 좀 하신분들은 가운데 색상표를 보고 RGB를 떠올릴 수도 있을 것 같습니다.
그림판을 통해서 그림을 자세히 보도록 하겠습니다.
이미지의 가로, 세로 크기는 629 x 95이며 왼쪽 빨간색 사각형 부분(2, 47 pix)을 그림판의 스포이드로 RGB 값을 보니 RGB 모두 115 값으로 되어 있고 위치는 대략 세로 크기의 가운데 쯤 위치해 있는 것 같습니다.
이제 파이썬의 이미지 라이브러리 PIL에 대해 설명하겠습니다.
- PIL(Python Imaging Library) : 파이썬을 이용해서 이미지 프로세싱을 할 수 있게 도와주는 라이브러리
(정식 라이브러리는 아니고 서드 파티 라이브러리 인 것 같습니다.)
※ PIL은 3.x 버전은 지원하지 않으므로 3.x버전에서는 Pillow라는 라이브러리를 사용해야 합니다. (사용 방법은 동일)
그러나 본인의 환경에서는 설치가 되지 않아, 이번 실습은 2.7 버전에서 진행하겠습니다.
(※ 대소문자 주의)
- Image.open() : 이미지 객체 생성
- size : 이미지 크기 반환 (가로, 세로)
- getpixel((가로, 세로)) : 가로 x 세로 pixel에 해당하는 RGBA 값 반환
그림판에서 보았던 0 x 47 pix의 RGB 값을 보니 115로 동일한 것을 확인할 수 있습니다.
이제, 반복문을 통해서 이미지 가운데에 있는 회색 띠의 RGB 값들을 출력해 보겠습니다.
1 2 3 4 5 6 7 | import Image img = Image.open("oxygen.png") # 이미지 객체 생성 w, h = img.size # 가로, 세로 크기 반환 for i in range(0, w): print img.getpixel((i, 47)) # 가로는 0~끝까지 / 세로는 절반크기인 47로 고정 | cs |
실행 결과 첫번째 색상은 6번씩 반복, 나머지는 7번씩 반복되는 것을 보실 수 있습니다. 실제 이미지에서도 제일 첫번째 색상이 약간 작은 것을 확인할 수 있습니다.
7칸씩 건너띄면서 RGB 값을 받아오면서 해당 값을 Ascii 문자로 변환하면 아래와 같은 결과가 나옵니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 | import Image img = Image.open("oxygen.png") w, h = img.size result = "" for i in range(0, w, 7): rgb = img.getpixel((i, 47)) if rgb[0] == rgb[1] == rgb[2]: result += chr(rgb[0]) print result | cs |
뒤쪽에 숫자를 Ascii코드로 변환시키면 정답이 나올 것 같습니다.
최종 문제풀이는 다음과 같습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | import Image, re img = Image.open("oxygen.png") # 이미지 객체 생성 w, h = img.size # 가로, 세로 크기 반환 result = "" for i in range(0, w, 7): # 0부터 가로 크기만큼 7칸씩 건너띄어서 rgb = img.getpixel((i, 47)) # (가로, 세로)에 해당하는 RBGA 값 반환 if rgb[0] == rgb[1] == rgb[2]: # R, G, B 값이 동일하면 result += chr(rgb[0]) # 문자로 반환 digit = re.findall("\d+", result) # result 문자열에 숫자를 찾아서 리스트로 반환 for i in range(0, len(digit)): # 리스트에 있는 각각의 숫자를 int_digit = int(digit[i]) # int형으로 변환 print chr(int_digit), # 다시 문자로 반환 | cs |
[결과]
'WarGame > PythonChallenge' 카테고리의 다른 글
Python Challenge 09 :: turtle (0) | 2015.10.31 |
---|---|
Python Challenge 08 :: bz2 (0) | 2015.10.31 |
Python Challenge 06 :: zipfile (0) | 2015.10.26 |
Python Challenge 05 :: pickle (0) | 2015.10.23 |
Python Challenge 04 :: urlparse (0) | 2015.10.22 |