一直以为Bitblt在最后一个参数指定SRCCOPY模式的时候是逐点拷贝,但是现在才发现我错了
同样一幅图片,我用Bitblt打印到打印机,发现文字会有重影,效果比较粗糙,但是用SetPixel却很清晰。让我很失望,原来使用StrechBlt,我以为是图像缩放导致失真,现在换成BitBlt,没有任何缩放,结果却和StrechBlt差不多,只有换成SetPixel才能保证效果,但是这样做速度太慢了,无法忍受
还有其他更好的方法吗》?300分送上
同样一幅图片,我用Bitblt打印到打印机,发现文字会有重影,效果比较粗糙,但是用SetPixel却很清晰。让我很失望,原来使用StrechBlt,我以为是图像缩放导致失真,现在换成BitBlt,没有任何缩放,结果却和StrechBlt差不多,只有换成SetPixel才能保证效果,但是这样做速度太慢了,无法忍受
还有其他更好的方法吗》?300分送上
看一下msdn里面Bitblt的Res
http://topic.csdn.net/t/20021115/09/1178628.html
pDC->SetStretchBltMode(COLORONCOLOR);
...
pDC->StretchBlt((int)((rect.right - rect.Width()/2)-((rect.Height()/scale)/2)), 在使用StrechBlt函数前需要加上pDC->SetStretchBltMode(COLORONCOLOR);这样图像就不会失真
但BitBlt最好不要直接忘打印设备上写,失真很严重!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模式。
就是用这个函数的,发现有重影,然后改用StrechBlt,BitBlt,都不行
起初就是怀疑是缩放导致的,才改用BitBlt,结果发现是一样的
你可能没有看明白,我说的是打印图片,图片中的文字有重影,不是单纯写文字。如果是写字就不会用BitBlt了还有,也不是dpi的问题。屏幕dpi是96,打印机dpi一般最少也600.我的图片就是按照打印机的dpi生成的,绝对可以很清晰。用SetPixel显示是很清晰的,没有任何重影,就是速度相当的慢,无法忍受
//注: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,是有缩放的,发现有重影,现在我已经把源区域和目标区域改成一样大小,还是有重影
里面具体的算法不清楚。也许该看看汇编码。
BitBlt是全图拷贝,将需拷贝的区间作为参数
SetPixel为逐点打印
拷贝和打印不一样,前者好像会丢失信息
你的意思我明白,不是这个原因。
图片是按照打印机的真实dpi生成的,打印机有多少个物理点,图像就有多少个像素。