wpf计算字符大小占像素_[读书笔记]《计算机科学速成课》——23 屏幕与2D图像显示...

早期的文本任务通过打印机显示,因为屏幕分辨率较低,无法显示清晰的文字,而将计算结果的文字打印在纸上,有更高的对比度和分辨率,屏幕一般只用于跟踪程序的运行情况,比如寄存器的值,可以节约纸,并且屏幕更新很快,对临时值很匹配。

最早最有影响力的是阴极射线管(Cathode Ray Tube,CRT),原理是将电子发射到有磷光体涂层的屏幕上,当电子撞击涂层时,会发光几分之一秒。并且因为电子是带电粒子,所以路径可以通过磁场进行控制。

d88fb70a48220022b0d7381ab514abbe.png
CRT

这样就有两种方法来绘制图形:

  1. 引导电子束描绘出形状,称为矢量扫描(Vector Scanning)。因为发光只持续一小会儿,如果重复速度足够快,就能得到清晰的图像。
  2. 第二种方法是按照固定路径,一行行从上到下、从左到右不断重复,只在特定的点打开电子束来绘制图形。这种方法称为光栅扫描(Raster Scanning)。用这种方法可以用很多小线段绘制图形,甚至文字。

0172e177c1429177308adc768d71fc75.png
矢量扫描和光栅扫描

随着屏幕的发展,我们终于可以在屏幕上显示清晰的点,称为像素(Pixel)液晶显示器(Liquid Crystal Display,LCD)也使用光栅扫描,每秒更新多次像素里红绿蓝的颜色。

dcd3cbff547ba1d35d97205bc17a083d.png
LCD

但是早期计算机不使用像素,因为内存中需要保存像素对应的值,使其占用太多内存,所以需要一些特殊技巧来渲染图形,知道内存发展到足够用的地步。

所以早期计算机不保存大量像素值,而是直接保存符号,其中80x25个符号是最经典的,若干每个字符用8个字节表示,一共也才16000位。为此,需要特殊的硬件来从内存读取字符,转换成光栅图形,这样才能显示到屏幕上,这个称为字符生成器(Character Generator),基本算是第一代显卡。

显卡内部有一小块只读存储器(Read Only Memory,ROM)存着每个字符的图形,称为点阵图案(Dot Matrix Patter)。如果显卡看到某个字符对应的二进制代码,它就会把该字符的点阵图案通过光栅扫描的方式显示在屏幕的适当位置。为了显示,字符生成器会访问内存中一块特殊区域,这块区域专为图形保留,称为屏幕缓冲区(Screen Buffer),程序想显示文字时,就直接修改保存在这个区域的值就行。字符生成器这种方案用的内存很少,但只能画字符到屏幕上,无法绘制任意形状。

传统的ASCII编码的字符集太小,做不了很复杂的事情,因此对ASCII进行扩展增加更多的新字符,比如用于DOS的IBM CP437字符集,有写系统还会用额外的bit来定义字体颜色和背景颜色。

ed5e6e2937370390c9d9a9a8fefe531a.png
IBM CP437字符集

为了绘制任意形状,同时不会占用太多内存,就要使用CRT上的矢量模式。所有东西都是由一系列线条组成的,完全不需要有文本的概念,如果要显示文字,直接用画线的形式进行显示。我们使用一个早期适量显示系统Vectrex的命令为例

  1. 首先使用RESET命令来清空屏幕, 同时将电子枪的绘图点移动到坐标(0,0),也就是屏幕左上角,并将线的亮度设为0。
  2. 调用MOVE_TO 50 50,就会将绘图点移动到坐标(50,50)。然后使用INTENSITY 100将强度设为100, 然后反复调用以上命令就会绘制出对应图形。

bc3f29113c7d828553632a88c6f405ab.png

这些命令也就占160位,比直接保存一个像素矩阵好很多。

类似于之前的字符生成器把内存里的字符转换成图形一样,这些矢量指令也保存在内存中,通过矢量图形卡(Vector Graphics Card)画在屏幕上。然后通过数百个命令按序保存在屏幕缓冲区中,就能绘制出十分复杂的图形。并且因为这些矢量都在内存中,程序就可以更新这些值,让图形随时间进行变化,就出现了动画。

1962年诞生的Sketchpad是一个巨大的里程碑,它是一个交互式图形界面,用于计算机辅助设计(CAD),它被认为是第一个完整的图形程序。为了与图形界面进行交互,Sketchpad使用了输入设备——光笔,就是一个有线连着电脑的触控笔,笔尖用光线传感器,可以检测到显示器的刷新,并且通过判断刷新时间,电脑也可以知道笔所在的位置。使用光笔和各种按钮,用户可以画线和其他各种简单图案。

最早真正使用像素的计算机和显示器出现于1960年代末。内存中的位对应屏幕上的像素,称为位图显示(Bitmapped Display),通过对像素的控制,我们能够完全绘制任意的图形。可以将图形想象成是一个巨大像素值矩阵,之前计算机将像素数据保存在内存中一个特殊区域,称为帧缓冲区(Frame Buffer),但是后来保存在特殊的高速视频内存(Video RAM,VRAM)中,这个VRAM是在显卡上,这样访问速度更快。

在一个分辨率是60x35的8位灰度屏幕上,我们可用的颜色范围是0到255。如果我们想把(10,10)处的像素设为白色,可以使用frambuffer[10][10]=255, 如果我们想要从(30,0)到(30,35)画一条直线,可以使用

FOR y=0 TO 35
    framebuffer[30][y]=255
NEXT

使用相同方法,通过修改像素值就可以绘制任意图像。并且程序可以操纵帧缓冲区内的像素数据,来实现交互式图形。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值