들어가기 전에
먼저 지난번에 올렸던 '엑셀로 카가미를 그려봅시다'가 네이버 메인에 올라갔더군요 'ㅁ'
부족한 부분이 많은데도 관심을 가지고 봐 주셔서 정말 감사합니다.
그래서 이번에는 워드로 코나타를 한번 그려보도록 하겠습니다.
일단 기본적인 아이디어는 니코니코 동화에 업로드되었던 '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열에 커서를 두신 후 매크로를 실행해보세요.
귀여운 코나타의 모습이 표를 한 칸씩 채워나가는 걸 보실 수 있을 거예요^^

+ Recent posts