들어가기 전에
이 글은 예전에 니코니코 동화에 업로드되었던 'Excel로 나가토 유키'를 기반으로 하고 있습니다.
이미 많은 분들이 보셨고 수많은 파생작들이 쏟아져 나왔죠. (워드라던가 마리오페인터라던가 -_-;;)
그런데 지금 와서 갑자기 이걸 잡게 된 이유는... 그냥 심심해서랄까요 -ㅅ-
전반적인 기법은 니코니코를 많이 참고했지만 제가 Perl을 써 본 경험이 없는 관계로
이미지에서 RGB값을 뽑아내는 부분은 부득이하게 C로 다시 짜게 되었습니다.
정말 간단하긴 하지만 혹시 개선해야 할 부분이나 지적하실 부분이 있으시다면 언제든 덧글 남겨주세요^^


준비물
* 포토샵
* 엑셀 2007 (2003 이하 버전은 동시에 최대 56색까지밖에 쓸 수 없기 때문에 2007을 쓰시는 쪽이 좋습니다.)
* C 컴파일러 (저는 Visual Studio 6.0을 사용했습니다.)


제작과정
1. 이미지 준비
먼저 엑셀로 그리기 위한 이미지를 찾아 포토샵으로 편집합니다.
이미지를 적당한 크기로 잘라낸 후 RGB에 채널당 8비트로 설정해 주시구요, (기본으로 설정되어 있을 겁니다.)
이미지를 엑셀에서 사용할 셀 개수에 맞춰 리사이즈합니다. (저는 가로와 세로를 각각 130픽셀로 잡았습니다.)
마지막으로 리사이즈된 이미지를 'Save as...'에서 'Photoshop Raw' 포맷을 선택해서 저장해주시면
이미지 준비는 모두 끝납니다.
(저장하실 때 옵션에서 꼭 헤더 사이즈는 0으로, 채널은 'Interleaved Order'로 설정해주셔야 합니다.)

2. Raw 파일 변환
1번 과정을 무사히 마치셨다면 한 픽셀당 RGB값이 각각 1바이트씩 할당되어서
'전체 픽셀 수 * 3바이트'만큼의 용량을 가지는 Raw 파일이 생성되었을 겁니다.
그럼 이제 아래 C 소스를 이용해서 생성된 Raw 파일에서 RGB값을 뽑아내도록 하겠습니다.
 
#include <stdio.h>
#include <stdlib.h>

#define WIDTH 130
#define HEIGHT 130

void main()
{
   unsigned char red;
   unsigned char green;
   unsigned char blue;
 
   int colorVal;
   int i, j;
 
   FILE* source = fopen("image.raw", "rb");
   FILE* target = fopen("image.txt", "w");

   for(i=0 ; i<HEIGHT ; i++)
   {
      for(j=0 ; j<WIDTH ; j++)
      {
         red = fgetc(source);
         green = fgetc(source);
         blue = fgetc(source);

         colorVal = red + green*256 + blue*65536;

         fprintf(target, "%d", colorVal);

         if(j != WIDTH-1)
         {
            fprintf(target, ",");
         }
      }
      fprintf(target, "\n");
   }
   fclose(source);
   fclose(target);
}

이 코드를 컴파일해서 실행하면 Raw 파일의 RGB값이 10진수로 변환되어 텍스트 파일에 저장되며
나중에 엑셀에서 이 파일을 불러왔을때 각 픽셀의 색상값이 각각의 셀에 대응됩니다.
WIDTH와 HEIGHT에 정의된 값은 원하시는 이미지 사이즈에 맞춰 변경해주시면 되구요.
사실 BMP2CSV 같은 프로그램을 사용하면 이 과정을 생략할 수도 있지만 그럼 너무 시시하잖아요^^;

3. 매크로 작성 및 완성
이제 엑셀에서 아까 생성된 텍스트 파일을 불러오신 후 (이때 구분 기호에 쉼표도 꼭 체크를 하셔야 합니다.)
아래 매크로를 작성하시고 실행시키시면 새침데기 카가미가 워크시트 위에 서서히 모습을 드러냅니다.
 
Sub Color()
For i = 1 To 130
   For j = 1 To 130
   Cells(i, j).Interior.Color = Cells(i, j).Value
   Next
   
   currentHour = Hour(Now())
   currentMinute = Minute(Now())
   currentSecond = Second(Now()) + 1
   waitTime = TimeSerial(currentHour, currentMinute, currentSecond)
   Application.Wait waitTime
Next
End Sub

매크로 부분은 니코니코에 올라와 있는 것을 그대로 가져다 썼습니다.
For 구문의 루프 횟수는 이미지 사이즈에 맞게 적절히 조절해주시면 되구요,
'currentHour = Hour(Now())'부터 'Application.Wait waitTime'까지는
동영상을 찍기 위해 한 라인당 1초씩 딜레이를 준 부분이니
한시라도 빨리 카가미의 모습을 감상하고자 하시는 분은 저 다섯 줄을 지워버리셔도 상관없습니다^^
 
사용자
삽입 이미지

자, 이렇게 해서 귀여운 카가미가 완성되었습니다~>.<
이건 해상도를 조금 높여서 200*200 사이즈로 한번 만들어 봤어요.
그런데 제 컴퓨터가 많이 힘겨워하더군요 =ㅅ=

지금까지 이런 선사시대 자료를 읽어주셔서 감사합니다(__)
언젠가 시간이 나면 워드로 카가미에 한번 도전해보도록 하겠습니다~'ㅂ'

+ Recent posts