打印和屏显的视觉补偿??(88分)

  • 主题发起人 王寒松
  • 开始时间

王寒松

Unregistered / Unconfirmed
GUEST, unregistred user!
我在做打印时发现。 屏幕上的象素点位置显示转换为毫米显示后
总是有误差。 测算了一下。 大概1毫米有2象素点的误差。
我是自己做的报表标尺显示。 改进标尺源码。 经过视觉距离补偿后
屏幕上的显示完全正确了。 屏幕上显示的毫米数与我用尺子在屏幕上量的结果完全一致
可是这个距离到打印机上, 打印又出来误差了?
难道打印机也要经过补偿吗? 如果需要,要补偿多少?
问题虽小,却很偏僻。 谁能给个答案
 
没有人知道吗?
您可以自己试验一下.
首先 做一个小程序。 FORM上放一个 PANEL。 panel.width :=192;
然后运行。 你用尺子量一量 这个PANEL 的 宽度 是不是 50.8 毫米
按理说: Screen.pixelPerinch 给出的是 屏幕上每英寸的象素点数。一般是96
192就是2英寸。 那么PANEL 的屏幕上实际宽度应是50。8 毫米。 可实际显示结果
不是这样(比50。8长。大概54毫米左右)
难道是我用液晶显示器的结果?
 
屏幕的显示内容到打印机时也要转换,打印机有分辨率的,如
屏幕每英寸92dpi-打印机300dpi,实际打印时要调用系统函数获得当前打印机的
打印分辨率,然后换算得到。
CRT的每点直径小于LCD的,所以按点显示,JCD必然大一些。
 
那所见即所得岂不是句空话? 我在自己机器上做的报表工具。 现在屏幕标尺控件显示
的毫米数和屏幕上实际测量结果完全相符(我做了误差补偿)
如果这个工具到了一个球面显示器上。不就没用了吗?
还有。即使不做CRT误差补偿, 按屏幕象素点打印机象素点换算后实际打出来的
结果是: 屏幕上显示为 25毫米。 打印输出结果确是22 毫米。
这就是让我困惑的地方。
 
屏幕上的点是在变化的,因为屏幕有不同的解析度,而且不同尺寸的显示器显示区域大小
又不一样,所以你虽然做过误差补偿,但是能在所有解析度和各种显示器上用吗?
所见即所得,我们不是追求在屏幕上显示的和实际一样的大小,你最终还是要打印出来的,
关键是看打印出来的和你实际的一样大小。谁愿意天天拿把尺在屏幕上量呢?就象你说的
球面显示器怎么办?
你的问题关键就在于要做打印机分辨率适应,我觉得屏幕上仅仅是显示一个相对比例的
东西,未必和原样一致。我做的报表设计器需要设计一个宽行的报表,照你这么做屏幕
根本放不下(800X600),所以我是按比例缩小的。但是打印的时候做了分辨率适应。
打印的东西原样大小你是知道的,然后动态获得打印机的分辨率,换算出在这个分辨率
小打印这个实际尺寸需要打多少点,然后按这个点数打印出来就可以实现打印件与原样
大小一致了。
 
DPI只是一个近似值,而现在的显示器从.28/.21/.18都有,你看哪个能整除的?
那所见即所得并不是连尺寸也要精确吧。
另外,我想不要用屏幕——》打印的转换方式,应该为
实际尺寸-》屏幕 &
实际尺寸-》打印机的方式,你既然是自己做报表,就不要保存
什么屏幕的显示点数,而保留实际的尺寸数,这样换算时的误差就小多了
 
终于碰到一个回答的。 老兄啊。 我对自己的东东是严格要求。 现在已经能做到
屏幕上尺寸和实际尺寸一致。 只是现在屏幕尺寸和打印尺寸还有误差。 误差值在
每20厘米(横向) 有7毫米的误差
你说的屏幕上显示不下的问题。我用滚动框解决了
如果方便, 麻烦你帮我看看
程序在 http://www.bj99.net/ereport.exe
 
程序我看了,在我的笔记本上显示就和实际尺寸不一致,比实际尺寸小。
我的屏幕是13.3的,1024X768解析度的。所以我觉得你所追求的屏幕与
实际尺寸一致太累了。但是我不知道你的最终目的是什么?我认为做报
表的最终目的是打印出来的和实际一样就可以了。至于你的做法我总觉
得有什么地方不妥,但是现在又说不上来。我考虑一下,吃午饭先。
 
屏幕很难做到与实际一样吧
同一个显示器,调一调之后屏幕大小还变了呢
 
打印机不用补偿,打出来的是正确的,因为他的xxx dpi是很准确的
 
to Pipi.
一个程序对于不同的打印机肯定是要做分辨率适应才能使得打印出来的效果一致。这
已经不是什么补偿的概念了。
to 王寒松
我觉得应该是 屏幕尺寸=实际尺寸、打印尺寸=实际尺寸 这样来做。
而不是 屏幕尺寸=实际尺寸、打印尺寸=屏幕尺寸
 
打印机,SetMapMode ,如果使用 MM_TEXT 当然要自己搞分辨率
如果使用MM_HIMETRIC、MM_HIENGLISH 之类,逻辑点就是用长度来算的,驱动程序会计算
正确的分辨率。对打印机来说,这个很准
 
如果通过调解显示器上的按钮把显示窗口变小或变大了怎么办呢?我觉得你这样做意义不大
 
Pipi. 你写的正是我已经做过的。只不过我用的不是MM_TEXT,因为要做屏幕坐标和打印机坐标的
两个坐标系转换。 我用SetMapMode MM_ISOTROPIC SetWindowExtEx SetViewPortExtEx
appcat: 事实上我也是像你说的那么做的。 以实际尺寸做衡量标准。 结果是屏幕上的通过补偿暂时实现了(分辨率
变换时还没做到)。 但是打印机和实际尺寸有偏差, 所以我才有此一问。 想知道
是不是打印机也有这类的补偿。
pipi: 打印机的打印也是有误差的。不可能做到很准。 同一型号,不同打印机
都需要单独调校进纸偏差。 我已经在针打上碰到很多这样的事。
我不明白的事是: 我的打印机在 REPORT BUILDER上可以打的很准。 而我自己做的
打印工具确有偏差。 所以想是否 RB做了补偿操作.
看各位回复,我想RB 应该没做打印补偿。 我再仔细看看我的程序再说
 
进纸偏差主要调的是打印的位置吧?
但是在打印机上用 MM_HIMETRIC 画一厘米的线,它的长度就是1厘米很准确啊
 
Pipi.说的对啊,你说的误差是绝对偏移的误差还是相对尺寸的误差呢?
 
老王啊,你来看看这个是不是和你的ereport有关啊?
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1056441
 
是的。 那是几年前的作品了。 我现在做的是第2版。 所以对自己要求严格了些。
我上面提的问题说了。 在第一版里用的是纯API操作打印和显示。 但是打印效果有
误差。 所以我提出了这个问题。 从REPORT BULDER能在我机器上实现正确打印看
不存在打印机进纸和走纸绝对偏差。 从程序分析上看,我又分析不出自己程序到底
那里算的不正确。 造成打印偏差。 于是我就加了屏显标尺。 但又发现屏显标尺的显示
和打印出来的也不一致。
 
我想是这样的,我做的一个套打工具,没有在屏幕上做到原样大小,只是在打印机上做到
了原样大小。我的程序要面向不同的打印机,所以我自己做了分辨率调整,最后的结果是
打印出来的位置相对尺寸是非常准确的,但是存在进纸误差。后来又发现用激光打印机几
乎没有进纸误差,而用针打就有,我用了比较老的实达5440,进纸齿轮都有点磨损了,所
以它的误差是可测的,我在程序中加上了打印原点漂移调整,就能消除该误差了。而在全
新的EPSON LQ670k+平推票打上就不用进纸误差调整了。我没有用Pipi.的办法,自己算分
辨率的,相对位置还是很准确的。
根据你的情况,可能是你打印出来存在相对误差,比如你画一条20厘米的线,但是打印出
来的线只有19.3厘米,短了7毫米。所以我估计是分辨率换算的问题,也许问题不在你,
可能驱动程序换算精度不够,导致了误差的累积。如果你觉得方便的话,可以将你换算到
打印机坐标的代码让我看看,也许能发现一点问题。还有你的打印机是什么?
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
2K
import
I
顶部