C++ 使用打印后台处理程序API打印“原始”数据
我正在使用windows spooler API来打印一张简单的图片。 在文本模式下,打印机将图片打印为文本,就像将数据转换为字符一样。所以我必须使用原始模式,但在这种情况下没有附加任何内容。 代码如下:C++ 使用打印后台处理程序API打印“原始”数据,c++,printing,C++,Printing,我正在使用windows spooler API来打印一张简单的图片。 在文本模式下,打印机将图片打印为文本,就像将数据转换为字符一样。所以我必须使用原始模式,但在这种情况下没有附加任何内容。 代码如下: void camgl::printShoot() { HANDLE print_handle; DOC_INFO_1 docinfo1; DWORD bytes_written; docinfo1.pDocName = (LPTSTR)L"Shot.jpg"; docinfo1.pOutpu
void camgl::printShoot() {
HANDLE print_handle;
DOC_INFO_1 docinfo1;
DWORD bytes_written;
docinfo1.pDocName = (LPTSTR)L"Shot.jpg";
docinfo1.pOutputFile = NULL;
docinfo1.pDatatype = (LPTSTR)L"RAW";
BOOL bool1, bool2, bool3, bool4;
bool1 = OpenPrinter((LPTSTR)L"Canon MG6300 series Printer", &print_handle, NULL);
bool2 = StartDocPrinter(print_handle, 1, (LPBYTE)&docinfo1);
bool3 = StartPagePrinter(print_handle);
bool4 = WritePrinter(print_handle, (LPVOID)image->imageData, (DWORD)image->imageSize, &bytes_written);
EndPagePrinter(print_handle);
EndDocPrinter(print_handle);
ClosePrinter(print_handle);
}
变量图像的定义如下:
IplImage*图像;
其中IplImage是OpenCV类型的图像
我已尝试将换页字符发送到打印机,但未成功:
int iFF = 0x0c;
WritePrinter(print_handle, (LPVOID)&iFF, (DWORD)sizeof(iFF), &bytes_written);
在这两种情况下,打印队列都会显示与PrintShot方法相对应的作业,然后清除队列,不会出现错误,打印机不会打印任何内容
===========================
我添加了我刚刚发现的这篇文章:
WritePrinter仅支持GDI打印 打印JPEG图像需要更多代码。 如果是紧急情况,您可以尝试调用命令行 MS Paint可打印JPEG图像
C:\Windows\System32\mspaint.exe C:\image.jpg /p
我通过使用XPS API找到了一个解决方案,如下所述: 这里有一个示例代码:
这是一种廉价的喷墨打印机,没有自己的打印语言,如Postscript或PCL。也不需要内存来存储页面。他们依靠打印机驱动程序来完成繁重的工作。打印机可能不会打印JPEG图像。您是否检查过像或WritePrinter这样的文章/解决方案?Printer仅支持GDI打印。打印机是佳能MG6350。GDI似乎不受支持。支持XPS。我发现了一个相关的sourceforge项目,其中包含一个源代码:不幸的是,imageprinter或emfprinter项目没有帮助。如果不喜欢,请告诉我,我将删除答案。不要投反对票!这是一个很好的解决方案,但我还有一周的时间来寻找另一种方法。我需要绕过打印机弹出窗口,但直接与打印机对话。