サーマルプリントヘッドの印刷原理とCは白黒ビットマップの拡大を実現する

4228 ワード

最近のプロジェクトでは、一眼レフ機がサーマルプリンタの画像と文字を印刷する機能を制御する必要があるが、選択したワードライブラリICは32*32の中国語ドットマトリクスと32*16の英語ドットマトリクスを最大でサポートする.より大きなフォントを表示する必要がある場合は、2倍以上拡大すると明らかな鋸歯エッジが現れるため、元の32*32ビットマップを64*64に拡大するドットマトリクスをコードで実現する必要があります.したがって,コードでは2倍の増幅しか実現していない.
サーマルプリンタの印刷原理
サーマルプリンタは、1行のドットマトリクスデータを加熱するたびに、このプロジェクトで使用されるサーマルプリンタの1行に384個のホットスポットがあるため、1行あたり384/8=48バイトのドットマトリクスデータがあります.
#define MAX_WIDTH 48 //                   

1バイトごとに8ビットの加熱データビットがあり、1は最終的に加熱して黒に印刷され、0は加熱されず、加熱データによって異なる.最終的に異なる加熱効果を示した.印刷する文字列仕様を、対応する文字列ドットマトリクスバッファに変換します.ここで注意すべきは、行ごとに最大48バイトのドットマトリクスデータが印刷され、このバッファ内の各文字のドットマトリクスの横並びを処理する必要があることである.次いで、48バイトのドットマトリクスデータが、感熱プリンタに送信されるたびに送信される.1行加熱した後、ステッピングモータの回転を制御し、紙送り機能を実現する.
1行のドットマトリクスデータを加熱した後、ステッピングモータの回転ステップ数を制御する:ステッピングモータの回転ステップ数=ホットスポットの高さ/ステッピングモータの回転ステップの排紙長さ最後に改行があって空白の行を印刷する必要がある場合、ステッピングモータの回転ステップ数を制御する:ステッピングモータの回転ステップ数=ホットスポットの高さ/ステッピングモータの回転ステップの排紙長さ*文字の高さ*行
画像を印刷する場合は、予め画像をバイナリ白黒ビットマップに処理する必要があり、幅を48バイト以内に制御し(サーマルプリンタの1行のホットスポットが48バイトである場合)、ビットマップデータをサーマルヘッドに1行ずつ転送し、加熱1行ごとにステッピングモータを制御して対応するステップ数を回転させ、印刷表示が必要な白黒画像のビットマップ数がすべて転送されて印刷されるまで制御する.
マルチグレースケールのピクチャ印刷実現方式(推理推測)
印刷された画像を必要とし、黒と白の色の変化をより豊かにする必要がある場合.画像処理時に、画像を階調値処理することができ、この場合、1行あたりのビットマップのバイト数は以下のようにしなければならない.
1行のビットマップに占めるバイト数=サーマルプリンタ1行の加熱ポイントバイト数*階調値の色次
その後、1行を色次数に応じて循環加熱し、現在の色次数に属するものは加熱し、属さない点は加熱せず、各色次数の加熱時間は最小階調値から最大階調値まで順次増加する.
ぎじふごう
for(   )
{
  for(MAX_WIDTH)
  {
     if(        ==     ) 
                      1
    else
                      0
  }
          (      *    )
}

ビットマップ増幅の原理
ビットマップを2倍に拡大する必要がある場合、画像全体のデータは4倍に増加し、1点対4点に属します.ソースビットマップの最初の行の最初の点であり、拡大されたビットマップの最初の行の最初の2番目の点と2番目の行の最初の2番目の点に対応する.ソースビットマップの1つのポイントは、実際には拡大後のビットマップの2*2ポイントに対応しています.
コード解析
1.ソースビットマップの各行をスキャンする
for (uint16_t i = 0;i < srcHigh;i++)

src Highはソースビットマップの高さ、すなわち拡大する必要がある行数である
2.1行の拡大が必要なバイト幅をスキャン
    for (uint16_t j = 0;j < srcWidth;j++)

src Widthはソースビットマップの幅単位バイトです
3.各バイトの各ビットをスキャンし、拡大処理を行い、ターゲットビットマップバッファの対応するビットに値を割り当てる
srcData = 0x80;
for (uint8_t k = 0; k < 8;k++)
{
       if ((src[i][j]&srcData) != 0)
       {
            dst[i*multiple][j*multiple+((k*multiple)/8)] |= temp;
        }
    temp = temp >> 2; if (temp == 0x00) temp = 0xC0;  
    srcData = srcData >> 1;
}

まず、1バイトの最上位ビットが1であるか否かを判断し、1であれば、ターゲットビットマップの対応するバイトの2つの隣接ビットが1に割り当てられる.[j*multiple+(k*multiple)/8)はバイトオフセット量を計算するために使用され、j*multipleはターゲットビットマップバッファに対応するソースビットマップの現在の増幅バイトの初期オフセットバイトを計算する.((k*multiple)/8)は後続のオフセット量を計算する.計算結果が1以上の場合、1バイトオフセットし、新しい増幅データを格納する.temp=temp>>2;if(temp==0 x 00) temp = 0xC0; バイナリ11000000を16進数に変換すると0 xC 0であり、高位判定が終了した後、より低いビットを判定する場合、tempをさらに2ビット右にシフトしてこそ、ターゲットビットマップバイトのより低い2ビット付与を実現することができる.srcData = srcData >> 1;ソースビットマップバイトビット判定基準値.
完全な実装コード
void bitmapMagnify(uint8_t src[][MAX_WIDTH],uint8_t dst[][MAX_WIDTH],
    uint8_t multiple,uint16_t srcWidth, uint16_t srcHigh )
{
    uint8_t temp = 0xC0;
    uint8_t srcData = 0x80;
    
    switch (multiple)
    {
        case 0x02:
            for (uint16_t i = 0;i < srcHigh;i++)
            {
                for (uint16_t j = 0;j < srcWidth;j++)
                {
                    srcData = 0x80;
                    
                    for (uint8_t k = 0; k < 8;k++)
                    {
                        if ((src[i][j]&srcData) != 0)
                        {
                            dst[i*multiple][j*multiple+((k*multiple)/8)] |= temp;
                        }
                        temp = temp >> 2; if (temp == 0x00) temp = 0xC0;  
                        srcData = srcData >> 1;
                    }
                }
                for (uint8_t a = 0; a < multiple; a++)
                {
                    for (uint16_t b = 0; b < multiple*srcWidth;b++)
                        dst[i*multiple+a][b] = dst[i*multiple][b];
                }
            }
            break;
        case 0x04:
            break;
        case 0x08:
            break;
        default :
            break;
    }
}
/****************************************************