|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
请帮我看一下我的这个代码,我是将一个1000mm宽,2000mm高,1200dpi的二值图通过按图像宽度和100像素高度分块加载后依次将分块图像绘制到打印机DC上进行打印,但始终只能打印到300多mm就是空白区域了,页面大小还是正常,就是后面就全是空白,没有内容,不知道为什么,而且我用这种方式打印出来的打印机缓存文件(*.spl)达到3.99G,而同一个图通过coreldraw加载打印出来的缓存文件只有300MB左右,不知道是什么原因
- void CMy001Dlg::OnBnClickedOk()
- {
- cv::Mat image = cv::imread("605x780_P1_GRAY.tif", cv::IMREAD_UNCHANGED);
- if (image.empty()) {
- AfxMessageBox(_T("无法加载图像!"));
- return;
- }
- int width = image.cols;
- int height = image.rows;
- int blockSize = 100;
- HANDLE hPrinter = NULL;
- BYTE* pPrinterInfo = NULL;
- PRINTER_INFO_2* pInfo2 = NULL;
- DEVMODE* pDevMode = NULL;
- CDC printerDC;
- int dpi = 1200;
- CString strPrintDevice = _T("HP Designjet T730");
- cv::Mat result = cv::Mat::zeros(height, width, image.type());//创建拼接大图尺寸
- for (int y = 0; y < height; y += blockSize) {//按blackheight指定调试加载图像
- for (int x = 0; x < width; x += image.cols) {//按图像宽度分割加载
- int currentBlockHeight = std::min(blockSize, image.rows - y);
- cv::Rect roi(x, y, std::min(image.cols, width - x), std::min(blockSize, height - y));//定义切割矩形块区域
- cv::Mat block = image(roi);//按roi区域分割图像
- cv::Mat bgr;
- cv::cvtColor(block , bgr, cv::COLOR_BGR2BGRA); // Make sure type is correct
- // Step 2: Create bitmap info
- BITMAPINFO bitmapInfo = { 0 };
- bitmapInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
- bitmapInfo.bmiHeader.biWidth = bgr.cols;
- bitmapInfo.bmiHeader.biHeight = -bgr.rows; // Flip image vertically
- bitmapInfo.bmiHeader.biPlanes = 1;
- bitmapInfo.bmiHeader.biBitCount = 32;
- bitmapInfo.bmiHeader.biCompression = BI_RGB;
- // 打开打印机
- LPWSTR ptName = strPrintDevice.GetBuffer();
- if (!OpenPrinter(ptName, &hPrinter, NULL)) {
- AfxMessageBox(_T("打印机端口打开失败!"));
- return;
- }
- // 获取打印机信息
- DWORD needed;
- GetPrinter(hPrinter, 2, NULL, 0, &needed);
- pPrinterInfo = new BYTE[needed];
- if (!GetPrinter(hPrinter, 2, pPrinterInfo, needed, &needed)) {
- AfxMessageBox(_T("打印机信息获取失败!"));
- delete[] pPrinterInfo;
- ClosePrinter(hPrinter);
- return;
- }
- pInfo2 = (PRINTER_INFO_2*)pPrinterInfo;
- int posX = 30; // 偏移位置
- int posY = 30;
- // 设置 DEVMODE
- pDevMode = (DEVMODE*)GlobalLock(pInfo2->pDevMode);
- if (pDevMode) {
- // 设置自定义纸张
- pDevMode->dmFields |= DM_PAPERWIDTH | DM_PAPERLENGTH | DM_PRINTQUALITY | DM_PAPERSIZE;
- pDevMode->dmPaperSize = DMPAPER_USER;
- pDevMode->dmPaperWidth = width / dpi * 25.4 * 10; // 1/10 mm
- pDevMode->dmPaperLength = height / dpi * 25.4 * 10; // 1/10 mm LcinkRIP不能超过32740
- pDevMode->dmPrintQuality = dpi; // DPI
- // 释放 DEVMODE
- GlobalUnlock(pInfo2->pDevMode);
- }
- // 创建和启动打印机上下文
- if (y == 0) {
- // 准备 DOCINFO
- DOCINFO docInfo;
- memset(&docInfo, 0, sizeof(DOCINFO));
- docInfo.cbSize = sizeof(DOCINFO);
- docInfo.lpszDocName = _T("test");
- docInfo.lpszOutput = NULL;
- printerDC.Attach(CreateDC(NULL, pInfo2->pPrinterName, NULL, pDevMode));
- printerDC.StartDoc(&docInfo);
- printerDC.StartPage();
- SetStretchBltMode(printerDC, HALFTONE);
- ::StretchDIBits(printerDC, x + posX, y + posY, bgr.cols, bgr.rows, 0, 0, bgr.cols, bgr.rows,
- bgr.data, &bitmapInfo, DIB_RGB_COLORS, SRCCOPY);
- }
- else {
- SetStretchBltMode(printerDC, HALFTONE);
- ::StretchDIBits(printerDC, x + posX, y + posY, bgr.cols, bgr.rows, 0, 0, bgr.cols, bgr.rows,
- bgr.data, &bitmapInfo, DIB_RGB_COLORS, SRCCOPY);
- }
- }
- }
- printerDC.EndPage();
- printerDC.EndDoc();
- // 释放资源
- delete[] pPrinterInfo;
- printerDC.DeleteDC();
- ClosePrinter(hPrinter);
- }
复制代码 |
|