쿠몬 식 영어 학습 장치 "E-Pencil"을 해킹 [2]

8649 단어 C++이미지 처리

실제로 도트를 배치하여 출력해 본다



지난번 계속.
1개의 격자를 64*64로 하고, 도트의 상대적인 위치를 이하와 같이 정의하였다.
int data_pos[8][2] = {
     {18,18},   //0 左上
     {32,16},   //1 上
     {46,18},   //2 右上
     {16,32},   //3 左
     {48,32},   //4 右
     {18,46},   //5 左下
     {32,48},   //6 下
     {46,46},   //7 右下
};

이것으로 3bit의 데이터를 좌표로 표현할 수 있게 되었으므로,
적당한 3bit의 데이터 배열을 준비해, 9개의 격자에 격납해 본다.
int data[9] = {0,1,2,3,4,5,6,7,0};
POINT DotPos[9];
for(int i=0; i<9; i++){
    int x = 64 * (i%3) + data_pos[data[i]][0];
    int y = 64 * (i/3) + data_pos[data[i]][1];
    DotPos[i].x = x;
    DotPos[i].y = y;
}

※제대로 실장할 때에는 만든 배열의 외측을 지정하지 않도록 주의한다.

그래서 실제로 점을 그릴 때 64x64의 상대 위치에서
실제로 그리려는 크기의 캔버스에 그립니다.
이번에는 Win32API의 HDC를 사용했으므로 원을 그리는 함수 Ellipse를 사용하여
    double scale = 2.5;
    int r = 7;
    for (int i = 0; i<9; i++) {
        int left   = (int)((DotPos[i].x - r) * scale);
        int top    = (int)((DotPos[i].y - r) * scale);
        int right  = (int)((DotPos[i].x + r) * scale);
        int bottom = (int)((DotPos[i].y + r) * scale);
        ::Ellipse(hDC, left, top, right, bottom);
    }

이렇게 하면 64*64의 격자에 대해 반경 7의 원을 그리는 이미지가 되지만,
실제로는 2.5배의 160*160픽셀에 반경 17.5(int에 캐스트되기 때문에 17)의 원이 그려진다.

키 닷이나 격자 닷도 그리면 이런 느낌이 된다.


이것으로 3*3의 격자 데이터를 화상에 할 수 있으므로,
이것을 x 방향으로 7회, y 방향으로 5회 반복함으로써 오리지널에 가까운 도트 화상을 만들 수 있었다.



간이적으로 도트 패턴 제너레이터를 만들었으므로,
임의의 9자리 정수(27bit 코드)로부터 도트 패턴을 생성할 수 있다.

인쇄해보기



그런데 실제로 인쇄해 보았지만…


흠, 도트가 부서져 버렸다. E-Pencil도 반응 없음.
이 화상이 약 10.0mm*7.0mm이므로, 상당히 세세한 것은 틀림없지만, 프린터의 한계일까?
그러나 프린터의 공칭 스펙에서는 9600 DPI로 낼 수 있을 것이므로,
프린터에 출력하는 쪽의 소프트의 문제일지도 모른다.

좀 더 인쇄 환경을 정돈하고 나서 재챌린지가 필요하다고 생각되므로,
계속은 또 이번이라고 하는 것에. 좀처럼 진행되지 않는다.

좋은 웹페이지 즐겨찾기