如何使用API控制打印机打印直线

tiger波波 2021-04-20 09:02:46
大家好:
为了测试打印机的分辨率,我生成了一张图片让打印机打印,图片大小为3780 x 5346(A4纸 210 x 297 的18倍)。我让图片第一行的像素为黑色,第二行的像素为白色,依次类推,打印出来的效果相当于在大约5mm的宽度上画了50条线。生成的图片如下(下边的空白被我截取了,方便上传):

正常情况下打印出来的效果应该是下图左边的情况(均匀分布),结果打印机打出来是右边的情况(不均匀分布)


据说这款打印机可以达到这个分辨率,所以我想,现在出现打印效果不均匀的情况,是不是因为直接让它打印图片,对打印机的控制不是很精细,无法发挥打印机的能力。所以我想直接用windows api控制打印机(打印机驱动本身没有提供api),看看能不能微操打印机实现均匀的效果。

我知道调用TextOut函数可以控制打印机打印文字,请教大家用什么api可以实现类似图片像素级的一行黑色,一行白色的直线效果,谢谢
...全文
502 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
zgl7903 2021-05-05
  • 打赏
  • 举报
回复
其实和在DC上绘制差不多

void TestPrinter()
{
  CPrintDialog dlg(FALSE, PD_SELECTION | PD_USEDEVMODECOPIES);
  if(dlg.DoModal() == IDOK)
  {
    CDC *pDC = CDC::FromHandle(dlg.GetPrinterDC());

    DOCINFO docinfo;
    memset(&docinfo, 0, sizeof(docinfo));
    docinfo.cbSize = sizeof(docinfo);
    docinfo.lpszDocName = _T("MyPrinter");

    // call StartDoc() to begin printing
    if (pDC->StartDoc(&docinfo) >= 0)
    {
      // start a page
      if (pDC->StartPage() >= 0)
      {
        int nSaveDC = pDC->SaveDC();
        //draw on pDC
        {
          CPen pen(PS_SOLID, 1, RGB(0,0,0));
          CPen *pOldPen = pDC->SelectObject(&pen);

          //可绘制区域
          CRect rcDev(0,0, 
            pDC->GetDeviceCaps(HORZRES), 
            pDC->GetDeviceCaps(VERTRES));

          //绘制一个椭圆
          pDC->Ellipse(&rcDev);
        
        }

        //恢复DC
        pDC->RestoreDC(nSaveDC);

        //End page
        pDC->EndPage();
      }

      //End print
      pDC->EndDoc();
    }


    pDC->DeleteDC();
  }

}

赵4老师 2021-04-29
  • 打赏
  • 举报
回复
参考: MSDN98\98VS\2052\SAMPLES\VC98\SDK\GRAPHICS\GDI\PRINTER\COMMON.H MSDN98\98VS\2052\SAMPLES\VC98\SDK\GRAPHICS\GDI\PRINTER\ENUMPRT.C MSDN98\98VS\2052\SAMPLES\VC98\SDK\GRAPHICS\GDI\PRINTER\ENUMPRT.H MSDN98\98VS\2052\SAMPLES\VC98\SDK\GRAPHICS\GDI\PRINTER\GETCAPS.C MSDN98\98VS\2052\SAMPLES\VC98\SDK\GRAPHICS\GDI\PRINTER\GETCAPS.H MSDN98\98VS\2052\SAMPLES\VC98\SDK\GRAPHICS\GDI\PRINTER\GETPDRIV.C MSDN98\98VS\2052\SAMPLES\VC98\SDK\GRAPHICS\GDI\PRINTER\GETPDRIV.H MSDN98\98VS\2052\SAMPLES\VC98\SDK\GRAPHICS\GDI\PRINTER\MAKEFILE MSDN98\98VS\2052\SAMPLES\VC98\SDK\GRAPHICS\GDI\PRINTER\PAINT.C MSDN98\98VS\2052\SAMPLES\VC98\SDK\GRAPHICS\GDI\PRINTER\PAINT.H MSDN98\98VS\2052\SAMPLES\VC98\SDK\GRAPHICS\GDI\PRINTER\PRINTER.BMP MSDN98\98VS\2052\SAMPLES\VC98\SDK\GRAPHICS\GDI\PRINTER\PRINTER.C MSDN98\98VS\2052\SAMPLES\VC98\SDK\GRAPHICS\GDI\PRINTER\PRINTER.DEF MSDN98\98VS\2052\SAMPLES\VC98\SDK\GRAPHICS\GDI\PRINTER\PRINTER.DSP MSDN98\98VS\2052\SAMPLES\VC98\SDK\GRAPHICS\GDI\PRINTER\PRINTER.H MSDN98\98VS\2052\SAMPLES\VC98\SDK\GRAPHICS\GDI\PRINTER\PRINTER.ICO MSDN98\98VS\2052\SAMPLES\VC98\SDK\GRAPHICS\GDI\PRINTER\PRINTER.RC MSDN98\98VS\2052\SAMPLES\VC98\SDK\GRAPHICS\GDI\PRINTER\PRINTER.RES MSDN98\98VS\2052\SAMPLES\VC98\SDK\GRAPHICS\GDI\PRINTER\README.TXT MSDN98\98VS\2052\SAMPLES\VC98\SDK\GRAPHICS\GDI\PRINTER\STRINGS.H MSDN98_1.ISO http://pan.baidu.com/s/1dDF41ix, MSDN98_2.ISO http://pan.baidu.com/s/1bnGo0Vl
赵4老师 2021-04-29
  • 打赏
  • 举报
回复
估计是打印时自动缩放了:
tiger波波 2021-04-29
  • 打赏
  • 举报
回复
顶一下,我还是想知道如何使用API精细化控制打印机
tiger波波 2021-04-20
  • 打赏
  • 举报
回复
引用 3 楼 bluesen 的回复:
[quote=引用 2 楼 tiger波波 的回复:][quote=引用 1 楼 bluesen 的回复:]还不如用程序(比如opencv)在标准A4纸尺寸的画布上画线,然后生成jpg或png文件,再打印出来 打印控制api我觉得不是关键
我就是用程序生成的图片 ------- 为了测试打印机的分辨率,我生成了一张图片让打印机打印[/quote] 实在对不起,前面没仔细读你的帖子。 我怀疑还是打印机的分辨率不够,不如先试试更低的分辨率,慢慢增加。比如你先在5mm的宽度上画了10条线,再20,30...逐步看效果[/quote] 谢谢提供的思路,打印机据说分辨率够。我试了下,把图片分辨率提上去效果好一些了,原来是3780 x 5346(A4纸 210 x 297 的18倍),现在是72倍,一张bmp图片700多M,效果比18倍好
bluesen 2021-04-20
  • 打赏
  • 举报
回复
引用 2 楼 tiger波波 的回复:
[quote=引用 1 楼 bluesen 的回复:]还不如用程序(比如opencv)在标准A4纸尺寸的画布上画线,然后生成jpg或png文件,再打印出来
打印控制api我觉得不是关键

我就是用程序生成的图片
-------
为了测试打印机的分辨率,我生成了一张图片让打印机打印[/quote]
实在对不起,前面没仔细读你的帖子。

我怀疑还是打印机的分辨率不够,不如先试试更低的分辨率,慢慢增加。比如你先在5mm的宽度上画了10条线,再20,30...逐步看效果
tiger波波 2021-04-20
  • 打赏
  • 举报
回复
引用 1 楼 bluesen 的回复:
还不如用程序(比如opencv)在标准A4纸尺寸的画布上画线,然后生成jpg或png文件,再打印出来 打印控制api我觉得不是关键
我就是用程序生成的图片 ------- 为了测试打印机的分辨率,我生成了一张图片让打印机打印
bluesen 2021-04-20
  • 打赏
  • 举报
回复
还不如用程序(比如opencv)在标准A4纸尺寸的画布上画线,然后生成jpg或png文件,再打印出来
打印控制api我觉得不是关键
tiger波波 2021-04-20
  • 打赏
  • 举报
回复
引用 5 楼 zgl7903 的回复:
图片的话 打印是否有缩放? 图片DPI和打印机DPI是否匹配?
应该是缩了,不管图片多大的分辨率,打印出来还是一样大。图片DPI和打印机DPI是什么?
zgl7903 2021-04-20
  • 打赏
  • 举报
回复
图片的话 打印是否有缩放? 图片DPI和打印机DPI是否匹配?

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧