一直以为Bitblt在最后一个参数指定SRCCOPY模式的时候是逐点拷贝,但是现在才发现我错了
同样一幅图片,我用Bitblt打印到打印机,发现文字会有重影,效果比较粗糙,但是用SetPixel却很清晰。让我很失望,原来使用StrechBlt,我以为是图像缩放导致失真,现在换成BitBlt,没有任何缩放,结果却和StrechBlt差不多,只有换成SetPixel才能保证效果,但是这样做速度太慢了,无法忍受
还有其他更好的方法吗》?300分送上

解决方案 »

  1.   

    试试用GDI+里Graphics的DrawImage方法试试,它可以做到设备无关.
      

  2.   

    打印的话应该用 SetDIBits 比较好
    看一下msdn里面Bitblt的Res
      

  3.   

    是不是你的CDC和打印机的上下文不兼容啊
      

  4.   

    这个帖子里提到一种解决方法,楼主可以试试
    http://topic.csdn.net/t/20021115/09/1178628.html
      

  5.   

    用StrechBlt就可以,代码怎么写的?
      

  6.   


    pDC->SetStretchBltMode(COLORONCOLOR);
    ...
    pDC->StretchBlt((int)((rect.right - rect.Width()/2)-((rect.Height()/scale)/2)), 在使用StrechBlt函数前需要加上pDC->SetStretchBltMode(COLORONCOLOR);这样图像就不会失真
    但BitBlt最好不要直接忘打印设备上写,失真很严重!GDI+很强大,不过接触很少。关注下
      

  7.   

    楼主的问题确实只存在的 而且不管是GDI+ 还是GDI都不能解决这个问题 
    我记得有一次我想用斜线填充一个区域 因为斜线的间距比较大 所以使用GDI+的HatchBrush无法满足要求
    于是我就用了TextureBrush 做了一张斜线的背景图 图片上画的是一条1个像素宽度的直线 
    本来认为这样就没有问题了 因为在显示器上显示是没有问题的
    但是打印出来的时候确发现出了问题 本来一个像素的直线 被打印的有点宽了 而且线也不怎么直
    后来一直改图片 我甚至想把图片中直线的宽度改成0.5个像素 但是这个是做不到的
    最后我没有使用图片填充 而是干脆使用了画线填充  使用了Graphics类中的一个SetClip方法来限定区域当然后来我也没有再考虑这个问题了 但是我觉得这个问题应该和打印DC以及屏幕DC使用的单位上有关系一个最明显的问题就是屏幕DC是72像素对应1英寸? 打印DC好像是96个打印像素对应1英寸另外楼主如果想打印文字的话 怎么会用到StretchBlt或者Bitblt呢?(对于操作打印机我不是很熟悉)
    我都是使用所见即所得的打印 简单点说就是 OnDraw里面绘制的东西就是我用打印机打印的东西 而OnDraw里面我是不会使用内存绘图的
    所以不会用到StretchBlt或者Bitblt 所以如果打印问题的话 也无非是使用TextOut 或者Graphics的DrawString如果文字达不到楼主的要求 楼主可以去查一下Graphics::SetTextRenderingHint这个函数 这个函数可以设置文字的Render模式。
      

  8.   

    就是用这个函数的,发现有重影,然后改用StrechBlt,BitBlt,都不行
      

  9.   


    就是用这个函数的,发现有重影,然后改用StrechBlt,BitBlt,都不行
      

  10.   


    起初就是怀疑是缩放导致的,才改用BitBlt,结果发现是一样的
      

  11.   


    你可能没有看明白,我说的是打印图片,图片中的文字有重影,不是单纯写文字。如果是写字就不会用BitBlt了还有,也不是dpi的问题。屏幕dpi是96,打印机dpi一般最少也600.我的图片就是按照打印机的dpi生成的,绝对可以很清晰。用SetPixel显示是很清晰的,没有任何重影,就是速度相当的慢,无法忍受
      

  12.   

    综合上面的建议,我怀疑可能是HBITMAP有问题,我先检查一下
      

  13.   

    经过验证,HBITMAP没有问题同样的点阵图,用SetPixel和Bitblt打印为什么会有这么大区别?问题还没有解决。
      

  14.   

    你认为BitBlt没有缩放?DPI的变化也会导致缩放。
      

  15.   

    //make HBITMAP
    //注:dataPtr为点阵数据
    BITMAPINFOHEADER bmih;
    memset(&bmih,0,sizeof(BITMAPINFOHEADER));
    bmih.biSize = sizeof(BITMAPINFOHEADER);
    bmih.biWidth = nWidth;
    bmih.biHeight = nHeight;
    bmih.biPlanes = 1;
    bmih.biBitCount = 24;
    bmih.biCompression = BI_RGB;

    BITMAPINFO bmi;
    memset(&bmi,0,sizeof(bmi));
    bmi.bmiHeader = bmih;StretchDIBits(hdcPrint,0,0,nWidth,nHeight,0,0,nWidth,nHeight,dataPtr,&bmi,DIB_RGB_COLORS,SRCCOPY);
    之前一直使用StretchDIBits,是有缩放的,发现有重影,现在我已经把源区域和目标区域改成一样大小,还是有重影
      

  16.   

    看来是BitBlt或者StretchBlt做了什么过渡优化计算
    里面具体的算法不清楚。也许该看看汇编码。
      

  17.   

    BitBlt或者StretchBlt是映射,setpixel是一个一个点的复制,效果来说本应该好一些。
      

  18.   

    我认为:
      BitBlt是全图拷贝,将需拷贝的区间作为参数
      SetPixel为逐点打印
      拷贝和打印不一样,前者好像会丢失信息
      

  19.   

    学习一下,虽然没有弄过这块记得画图的时候对于bitmap的都是用bitblt啊,然后选SRCCOPY,和原图一样,现在在看window程序设计,里面的第五章好像就讲了这些,是不是你画图的分辨率(也许不是)和打印的有偏差,就像显示文字一样,如果要想显示的和device参数不一样,会出现这样那样的问题。bitblt毕竟是一张图片贴上去,而setpixel确实按pixel一个点一个点来,它每个点对应打印上的每一个点(我说得可能有错误,自己这方面虽然看了下,但还不是很太理解,希望你能明白我意思就ok了),打个比方说,一张图如果是1:1的比例,然后打到一个4:3的设备上,肯定会出现一些问题
      

  20.   


    你的意思我明白,不是这个原因。
    图片是按照打印机的真实dpi生成的,打印机有多少个物理点,图像就有多少个像素。