目录
事由:
前两天做的那个通过 GetDIBits 直接取得 PictureBox 的图像数据后直接保存为 PNG 图片的程序在不同的电脑上运行后,发现得到的图像不一样,因为是将时间字串直接通过 Print 方法打印到 PictureBox 后,再提取图像数据保存文件,其中将 PictureBox 的背景色当作透明色,保存得到透明的 PNG 图片,程序界面如下:
有一台保存出的 PNG 图片中,文字图像边缘清晰,背景色扣除的相当干净,图上只有文字本身的颜色:
因为前景色是白色,所以用系统自带的画图打开也是全部纯白的:
而另一台电脑就不一样,得到的图像有一圈毛刺的边缘:
用画图打开更是明显:
当时就纳闷了,是什么原因,问了不靠谱的 AI 说怀疑是 GetDIBits 受显卡驱动什么的影响,因为两台机器显卡的确不同,高配的一台没有毛刺低配的那台才有,于是又找了几台更低配的机器测试,发现得到的都是边缘清晰的,没有毛刺,这就诡异了,说明不是显卡的问题,也不应该是 GetDIBits 的问题,而是 PictureBox 中的图像数据本身就不一样,于是重新调整了一下程序,给它直接保存 PictureBox 的 image 为 BMP 图片,并且加上机器名字便于区分:
Private Declare Function GetComputerName Lib "kernel32" Alias "GetComputerNameA" _
(ByVal lpBuffer As String, nSize As Long) As Long
Private Function GetComputerNameVB6() As String
Dim strComputerName As String * 255 ' 定义一个固定长度的字符串
Dim lngLen As Long ' 用于存储返回的字符数
Dim lngRet As Long ' 存储函数调用的结果
' 获取计算机名的实际长度
lngLen = 255
lngRet = GetComputerName(strComputerName, lngLen)
' 检查是否成功获取了计算机名
If lngRet <> 0 Then
' 如果成功,则截取实际的计算机名
GetComputerNameVB6 = Left$(strComputerName, lngLen)
Else
' 如果失败,可以在这里处理错误
GetComputerNameVB6 = "Error retrieving computer name"
End If
End Function
Private Sub Command3_Click()
Dim fn
fn = App.Path & "\DT." & GetComputerNameVB6() & ".bmp"
SavePicture Pic_DT.Image, fn
MsgBox "图像内容已保存为: " & fn, vbInformation, "提示"
End Sub
相同的文字通过 print 方法输出到 PictureBox 结果发现,得到的 BMP 文件 Crc32 校验码居然不一样!!!
Private Sub Form_Load()
'----------------初始化
With Pic_DT
With .Font
.Name = "Arial" ' 字体名称
.Size = 73 ' 字体大小
.Bold = True ' 加粗
End With
.CurrentX = 10
.CurrentY = -10
.ForeColor = vbWhite ' 设置前景色为红色
End With
Pic_DT.Print Format("2024-12-16 18:37:59", "YYYY-MM-DD HH:MM:SS")
End Sub
由此可见,不是 GetDIBits 的问题,而是 PictureBox 中的图像数据问题。
纳闷中,搜索了一下文字毛刺的问题,发现蹦出来个 ClearType !才一下子想起来这个诡异又难用的东西!!!
赶快打开设置看了一下,发现没有毛刺的几台机器都没有开 ClearType ,而开了 ClearType 的不管怎么设置,都有毛刺,这就非常影响我在 PictureBox 中使用 Print 方法了呀,这样搞得背景颜色扣不干净,用颜色相似度判断也搞不干净背景色,随后,在没开 ClearType 的机器上又测试了一下打开 ClearType 发现的到的是预期的毛刺结果,这才最终确定罪魁祸首就是 ClearType !
但当我测试完了想关掉 ClearType 时,发现在打开那里关掉选项,按照有人说的一路 next 后,发现整个系统文字显示变得更加糟糕,而且 print 得到的图像一样毛刺:
问了 AI 给了个所谓的改注册表的方法,完全无效!
无奈只能先恢复了 Ghost 镜像重装了系统。
继续搜索测试,又看到又说去掉 ClearType 勾选,一路下一步结束后,调整下屏幕分辨率就好了,测试了下无效。
于是就想既然是刷新显示,那么直接设置一下“视觉效果”应该可以,试了下果然成功恢复到没开 ClearType 的状态了,以此记录!
解决方法:
下面是具体操作记录:
首先是调整 ClearType ,屏幕空白处点右键——个性化——字体——调整 ClearType 文本:
打开设置后可以明显看到,字体显示是清晰的,勾选上反倒有点边缘模糊,实际上,现在的液晶显示器按照显示器实际分辨率设置显示分辨率后根本没必要打开 ClearType ,
开了反而显示更模糊:
这是没开 ClearType 下,文件夹文字的显示效果,相当清晰,特别是放大后,可以看到边缘无毛刺:
而打开 ClearType 后,可以发现显示的文字都有毛刺的边缘,模糊不清:
放大后,可以看到,文字外加了一圈彩色的毛边,这就会导致背景色扣除后,无法得到完整的文字前景色:
在画图中,将资源管理器窗口截图进去用纯色填充就可以发现区别很大:
这个是开了 ClearType 有毛刺的:
这个是没开 ClearType 清晰的:
可以看到没开 ClearType 的话,才可以得到清晰的边缘,而打开 ClearType 后,要关闭的话,单单从一开始打开那里是关不掉,重启也不行:
可以看到,打开又关闭了 ClearType 点完了下一步后, 系统文字显示并未回到一开始没开 ClearType 的状态,显示效果反而更糟了:
此时就必须重新刷新视觉效果,才回得去,在“此电脑”点右键点属性——高级系统设置:
如果是最新的系统,那么界面会不一样,要点击弹出的设置窗口的右侧的“高级系统设置“:
接下来在”系统属性“窗口”高级“页”性能”栏目下点击“设置”按钮,以设置视觉效果:
可以看到弹出的窗口上文字相当模糊,然后切换设置“调整为最佳外观”和“调整为最佳性能”这两个选项并点击应用(例如:你打开后默认选择的是“调整为最佳性能”那么就切换到“调整为最佳外观”点击应用):
最后将“视觉效果”设置为“调整为最佳性能”,然后点击 应用——确定:
这个窗口点击应用后,但鼠标划过下面的三个按钮时,你会发现刚才还模糊不清的文字忽然变清晰了,而其他没动的文字暂时还没变过来,
这时不用担心,关闭窗口重新打开你就会发现全部文字显示都变回原始没开 ClearType 时候的效果了(请看“淡入淡出”前三个字的不同):
至此,终于得偿所愿,关闭了起反作用的 ClearType 了。
总结:
在以前的老显示器和其他性能较差无法开到正确分辨率的显示器上,启用 ClearType 的确可以提升文字显示清晰度。
但是,对于视力正常的人来说,在性能正常的1080p、2K、4K显示器上打开 ClearType 反倒会起到反作用,会感觉文字显示模糊不清。
而我上面的程序需要得到效果正确的透明背景 PNG 图片那更是不能开 ClearType 了。
因此,喜欢开 ClearType ,觉得我认知反常的欢迎来喷。