Question

Here is what I have set up so far

http://nicholas.piasecki.name/blog/2009/12/sending-a-bit-image-to-an-epson-tm-t88iii-receipt-printer-using-c-and-escpos/

I followed this guide and now I am able to print a bitmap image to receipt printer.

But now I would line to center the image on the receipt printer and can seem to understand how to implement this within his code. Can someone please help me figure out where to insert spaces the achieve this?

Here is the writing bitarray part taken from the code:

    bw.Write(AsciiControlChars.Newline);
    bw.Write("                 Hello World!");
    bw.Write(AsciiControlChars.Newline);
    bw.Write("          "); 

^^^This bw.Write(" "); moves the first line over

    // So we have our bitmap data sitting in a bit array called "dots."
    // This is one long array of 1s (black) and 0s (white) pixels arranged
    // as if we had scanned the bitmap from top to bottom, left to right.
    // The printer wants to see these arranged in bytes stacked three high.
    // So, essentially, we need to read 24 bits for x = 0, generate those
    // bytes, and send them to the printer, then keep increasing x. If our
    // image is more than 24 dots high, we have to send a second bit image
    // command.

    // Set the line spacing to 24 dots, the height of each "stripe" of the
    // image that we're drawing.
    bw.Write(AsciiControlChars.Escape);
    bw.Write('3');
    bw.Write((byte)24);

    // OK. So, starting from x = 0, read 24 bits down and send that data
    // to the printer.
    int offset = 0;

    while (offset < data.Height)
    {
        bw.Write(AsciiControlChars.Escape);
        bw.Write('*');         // bit-image mode
        bw.Write((byte)33);    // 24-dot double-density
        bw.Write(width[0]);  // width low byte
        bw.Write(width[1]);  // width high byte

        for (int x = 0; x < data.Width; ++x)
        {
            for (int k = 0; k < 3; ++k)
            {
                byte slice = 0;

                for (int b = 0; b < 8; ++b)
                {
                    int y = (((offset / 8) + k) * 8) + b;

                    // Calculate the location of the pixel we want in the bit array.
                    // It'll be at (y * width) + x.
                    int i = (y * data.Width) + x;

                    // If the image is shorter than 24 dots, pad with zero.
                    bool v = false;
                    if (i < dots.Length)
                    {
                        v = dots[i];
                    }

                    slice |= (byte)((v ? 1 : 0) << (7 - b));
                }

                bw.Write(slice);
            }
        }

        offset += 24;
        bw.Write(AsciiControlChars.Newline);
    }
    // Restore the line spacing to the default of 30 dots.
    bw.Write(AsciiControlChars.Escape);
    bw.Write('3');
    bw.Write((byte)30);
    bw.Write("Text Is awsome");
    bw.Write(AsciiControlChars.Newline);
}
Was it helpful?

Solution

Basically the issue is that since we invoked bitmap image mode any space we inserted wasn't really adding any space to the stream so in order to solve it all you have to do it turn bitmap image mode off in your vertical loop and add spaces then simply switch the mode back to bitmap image mode.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top