C++ 使用打印后台处理程序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

我正在使用windows spooler API来打印一张简单的图片。 在文本模式下,打印机将图片打印为文本,就像将数据转换为字符一样。所以我必须使用原始模式,但在这种情况下没有附加任何内容。 代码如下:

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项目没有帮助。如果不喜欢,请告诉我,我将删除答案。不要投反对票!这是一个很好的解决方案,但我还有一周的时间来寻找另一种方法。我需要绕过打印机弹出窗口,但直接与打印机对话。