들어가기 전에
먼저 지난번에 올렸던 '엑셀로 카가미를 그려봅시다'가 네이버 메인에 올라갔더군요 'ㅁ'
부족한 부분이 많은데도 관심을 가지고 봐 주셔서 정말 감사합니다.
그래서 이번에는 워드로 코나타를 한번 그려보도록 하겠습니다.
일단 기본적인 아이디어는 니코니코 동화에 업로드되었던 'Word로 토모에 유키나'를 참고했습니다.
이걸 처음 만드신 분은 BMP2CSV를 사용해서 RGB값을 추출한 후 그걸 배열에 집어넣는 방법을 사용하셨지만
저는 엑셀로 카가미를 그리면서 만들어 둔 코드가 있기에 그걸 재활용해서 다른 방법으로 접근해 보았습니다.


준비물
* 포토샵
* 워드 2007 (워드도 2003 이하 버전은 사용할 수 있는 색상 수에 제한이 있기 때문에 2007을 사용했습니다.)
* C 컴파일러 (지난번과 마찬가지로 Visual Studio 6.0을 사용했습니다.)


제작과정

1. 이미지 준비
이미지 준비 과정은 엑셀과 동일합니다.
이미지를 적당한 크기로 잘라낸 후 RGB에 채널당 8비트로 설정해 주시구요, (기본으로 설정되어 있을 겁니다.)
워드에서 그림을 출력하는데 사용할 표의 셀 개수에 맞춰 리사이즈합니다.
이때 주의하셔야 할 점이 있는데요, 워드에서는 표의 행과 열의 개수를 각각 최대 63개까지밖에 설정할 수 없습니다.
따라서 이미지의 가로와 세로가 63픽셀 이하가 되도록 설정해 주셔야 합니다.
마지막으로 리사이즈된 이미지를 'File'의 '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 63
#define HEIGHT 63

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);
         fprintf(target, "\n");
      }
   }
   fclose(source);
   fclose(target);
}

코드가 엑셀 때와 거의 비슷하죠?
텍스트 파일로 출력될 때 한 라인에 RGB값을 하나씩만 찍어준다는 점을 제외하고는 완전히 같습니다.
WIDTH와 HEIGHT에 정의된 값은 원하시는 이미지 사이즈에 맞춰 변경해주시면 되구요.

3. 매크로 작성 및 완성
2번 과정까지 끝내셨다면 워드를 실행시키신 후 아래 매크로를 작성하세요.

Sub Color()
Dim fileName As String
Dim fileNum As Integer
Dim buffer As Variant

fileName = "c:\image.txt"
fileNum = FreeFile
Open fileName For Input As fileNum

For i = 1 To 63
   For j = 1 To 62
   Line Input #fileNum, buffer
   Selection.SelectCell
   Selection.Shading.BackgroundPatternColor = buffer
   Selection.MoveRight Unit:=wdCharacter, Count:=1
   Next j

   Line Input #fileNum, buffer
   Selection.SelectCell
   Selection.Shading.BackgroundPatternColor = buffer
   Selection.MoveDown Unit:=wdLine, Count:=1
   Selection.MoveLeft Unit:=wdCharacter, Count:=62
Next i

Close fileNum
End Sub

'fileName = "c:\image.txt"' 부분에는 2번 과정에서 생성된 텍스트 파일의 경로를 적어주시면 되구요,
For 구문의 루프 횟수와 'Selection.MoveLeft Unit:=wdCharacter, Count:=62'에서
Count에 들어가는파라미터 값은 이미지 사이즈에 맞게 조절해주시면 됩니다.
(바깥쪽 For 구문 : 이미지의 세로 사이즈, 안쪽 For 구문과 Count의 파라미터 값 : 이미지의 가로 사이즈 - 1)

사용자 삽입
이미지

매크로까지 준비가 다 되셨다면 표를 만드시고 표의 1행 1열에 커서를 두신 후 매크로를 실행해보세요.
귀여운 코나타의 모습이 표를 한 칸씩 채워나가는 걸 보실 수 있을 거예요^^


들어가기 전에
이 글은 예전에 니코니코 동화에 업로드되었던 '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