如何使用MFC在Epson打印机上打印图像?

问题描述 投票:0回答:2
我想使用ESCPO打印QR映像(位图)和文本。 我正在使用Visual Studio 2005。这是唯一可用的版本。 下面的逻辑是我到目前为止修改的。 pirnt收据结果→

输入图像描述在这里

我想要recipt→输入图像描述在这里

qr iamage在这里→输入图像说明此处

此QR图像是位图

{ CString csFileName = fileName; csFileName = csFileName.MakeUpper(); // 1. BMP image load HBITMAP hBmp = (HBITMAP)::LoadImage(NULL, fileName, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_MONOCHROME); if (hBmp == NULL) return ERR_PRT_WRITE; if (hBmp == NULL) return ERR_PRT_WRITE; CBitmap* pBmp = CBitmap::FromHandle(hBmp); BITMAP bmpInfo; memset(&bmpInfo, 0, sizeof(bmpInfo)); pBmp->GetBitmap(&bmpInfo); if (bmpInfo.bmBitsPixel != 1) { pBmp->DeleteObject(); return ERR_PRT_WRITE; } int pixelWidth = bmpInfo.bmWidth; int height = bmpInfo.bmHeight; int widthBytes = (pixelWidth + 7) / 8; int paddedRowBytes = bmpInfo.bmWidthBytes; int totalPaddedBytes = paddedRowBytes * height; BYTE* paddedData = new BYTE[totalPaddedBytes]; if (pBmp->GetBitmapBits(totalPaddedBytes, paddedData) != totalPaddedBytes) { delete [] paddedData; return ERR_PRT_WRITE; } BYTE* rasterData = new BYTE[widthBytes * height]; for (int row = 0; row < height; row++) { BYTE* src = paddedData + ((height - 1 - row) * paddedRowBytes); BYTE* dst = rasterData + (row * widthBytes); memcpy(dst, src, widthBytes); } delete [] paddedData; const char initPrinter[] = "\x1B\x40"; // ESC @ _printer.write((LPSTR)initPrinter, strlen(initPrinter)); const char pageModeOn[] = "\x1B\x4C"; // ESC L _printer.write((LPSTR)pageModeOn, strlen(pageModeOn)); const char setPageArea[] = { 0x1B, 0x57, // ESC W 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x37, 0x02 }; _printer.write((LPSTR)setPageArea, sizeof(setPageArea)); const char setAbsPosImage[] = { 0x1B, 0x24, 0x00, 0x00 }; // ESC $ _printer.write((LPSTR)setAbsPosImage, sizeof(setAbsPosImage)); BYTE m = 0x01; for (int row = 0; row < height; row++) { BYTE* rowData = rasterData + (row * widthBytes); BYTE nL = (BYTE)(widthBytes & 0xFF); BYTE nH = (BYTE)((widthBytes >> 8) & 0xFF); BYTE escStar[5] = {0x1B, 0x2A, m, nL, nH}; _printer.write((LPSTR)escStar, 5); _printer.write((LPSTR)rowData, widthBytes); } delete [] rasterData; const char setAbsPosText[] = { 0x1B, 0x24, 0xC8, 0x00 }; _printer.write((LPSTR)setAbsPosText, sizeof(setAbsPosText)); char textData[1024]; memset(textData, 0x00, sizeof(textData)); sprintf_s(textData, sizeof(textData), "%s", "Hi hello"); _printer.write(textData, strlen(textData)); _printer.write((LPSTR) "\x1B\x0C", 2); // ESC FF pBmp->DeleteObject(); return TRUE; }

我看过您的代码,我之前已经完成了此任务,但现在无法访问该代码。
本质上,我看到了您的代码两个问题 - 越少的是您真的不知道位图的字节格式(如果是颜色位图),因此您需要一种方法来拔出特定的值Pixel-因此,这个问题应该帮助您解决这个问题。
更重要的是,Epson打印机协议要求您一次编写8行。您需要构造一个由宽度字节组成的字节阵列,每个字节代表一个8像素垂直线。因此,您的行循环确实需要更像是这样的东西(不是实际的C ++,而是显示了想法):
c++ mfc escpos
2个回答
1
投票

我建议您首先仅获取QR码,然后修理计划,以包括QR码右侧的文本(您需要在第一行之后和第二行之前打印)。

希望这给您一些指导 - 这些东西是非常古老的学校,并且您使用的ESCPOS协议已有1980年底以来已经存在

这里是回答的线程,如何用escpos打印图像。

ESCPOS命令ESC*用于在打印机上打印位映像

我写的是glbasic中的一些代码,我写的是将图像打印到ESCPOS打印机。您可以使用3种方法。我发现ESC *最兼容的enc。 NV RAM,我无法正常工作,GS V 0方法效果最好,但据说被弃用。

https://www.glbasic.com/forum/index.php?topic = 11212.msg98892#msg98892


1
投票
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.