热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

白话计算机图形学初步-由一个小问题引发的故事

一、为何写本文  今天在学习android时遇到的一个问题:android程序从网络得到一张图片,显示在程序的imageview中,期间调用了bitmap把字节数组转化成位图文件,才能

一、为何写本文

  今天在学习android时遇到的一个问题:android程序从网络得到一张图片,显示在程序的imageview中,期间调用了bitmap把字节数组转化成位图文件,才能显示,自己对此很困惑:为何我们得到字节数组之后不能直接显示呢,而是要通过bitmap才可以显示?因此查了很多资料,有了一个初步的概念,另本文只做感性的理解,有一些地方表述的可能有问题,望读者见谅。

二、引入

  你知道我们打开电脑上的一张图片经历过了那些过程,计算机底层是怎么处理的吗?

  先给出答案,下面再做具体的分析:

  首先,CPU命令从硬盘读取数据,但不可能一下子就处理那么多数据,于是就让内存先存放着,然后CPU读取,数据一旦离开CPU,必须通过4个步骤,最后才会到达显示屏:

  1. 从总线(Bus)进入GPU :将CPU送来的数据送到北桥(主桥)再送到GPU(图形处理器)里面进行处理。

  2. 从 Video Chipset(显卡芯片组)进入 Video RAM(显存):将芯片处理完的数据送到显存。

  3. 从显存进入Digital Analog Converter:从显存读取出数据再送到RAM DAC进行数据转换的工作(数字信号转模拟信号)。但是如果是DVI接口类型的显卡,则不需要经过数字信号转模拟信号。而直接输出数字信号。

  4. 从DAC进入显示器(Monitor):将转换完的模拟信号送到显示屏。

  这里涉及了哪些知识呢?

  • 第一个问题:计算机是如何存储图片的?

  • 第二个问题:图片的数据是在内存中还是在显存中?

  • 第三个问题:涉及的硬件——硬盘,硬盘是怎么保存数据的?

  • 第四个问题:涉及的硬件——内存,内存是如何工作的?

  • 第五个问题:涉及显示,必然用到显卡,显卡是如何工作的呢?

  • 第六个问题:涉及到显示,必然用到显示器,显示器是如何工作的?

  下面的文章就会按照这几个问题展开来。

三、第一个问题:计算机是如何存储图片的?

  图像的存储原理

  从结构上讲,图形文件分为两种,即位图和矢量图。在位图中,图像由许多的屏幕小点(我们通常说的像素)组成,这些小点对应显存中的“位”,而就是这些“位”决定了像素的图形属性,如像素的颜色、灰度、明暗对比度等。一个二进制位可以表示很多东西。可以代表颜色、灰度、敏感这些属性。

四、第二个问题:图片的数据是在内存中还是在显存中?

  看你的程序需要,需要显示的话自然要进显存,否则在内存就可以了。

五、第三个问题:涉及的硬件——硬盘,硬盘是怎么保存数据的?

  计算机系统中,硬盘、软盘/软驱、光盘/光驱等称为存储器。它们用来存储信息,这些信息在它们的内部统统以 0 和 1 表示。

六、第四个问题:涉及的硬件——内存,内存是如何工作的?

  程序和数据平常存储在硬盘等存储器上,不管你开机或关机了,它们都是存在的,不会丢失。硬盘可以存储的东西很多,但其传输数据的速度较慢。所以需要运行程序或打开数据时,这些数据必须从硬盘等存储器上先传到另一种容量小但速度快得多的存储器,之后才送入 CPU 进行执行处理。这中间的存储器就是内存。

  无论何种存储器,软盘、硬盘、光盘或者内存,都有地址。因为它们要存储数据,所以就必须按一定的单位的数据分配一个地址。有了地址,程序才能找到这些数据。这很好理解,想想你们家为什么要有门牌号即可。

  学习编程,必须对内存的地址有一个透彻的理解。我们编程中的每一行代码,代码中用到的每个数据,都需要在内存上有其映射地址。当然,我们并不需要掌握内存是如何进行编址,那是计算机系中的另外一门课:操作系统的事了。

七、第五个问题:涉及显示,必然用到显卡,显卡是如何工作的呢?

1、什么是显卡

  显卡(Video card,Graphics card)全称显示接口卡,又称显示适配器,是计算机最基本配置、最重要的配件之一。显卡作为电脑主机里的一个重要组成部分,是电脑进行数模信号转换的设备,承担输出显示图形的任务。显卡接在电脑主板上,它将电脑的数字信号转换成模拟信号让显示器显示出来,同时显卡还是有图像处理能力,可协助CPU工作,提高整体的运行速度。对于从事专业图形设计的人来说显卡非常重要。

2、显卡的分类

  VGA和DIV
  VGA是模拟信号,清晰度一般。DVI是数字信号,清晰度良好。

3、VGA显示卡原理

VGA显示卡的主要组成

1.显示存储器(Display Memory)即显存
2.图形控制器(Graphics Controller)
3.数据串行发生器(serialize)
4.属性控制器(Attribute Controller)
5.数模转换器(DAC)
6.定序器(Sequencer)

这里重点讲解显存

什么是显存

  显存,也被叫做帧缓存,它的作用是用来存储显卡芯片处理过或者即将提取的渲染数据。如同计算机的内存一样,显存是用来存储要处理的图形信息的部件。显卡自己本身有内存,是显存,图形芯片相当于电脑的CPU,不过它的主要任务是处理显示信息,在处理信息的过程中,它会产生大量的临时数据(未处的、正在处理的、已经处理完成的),这就需要一个专门的地方来存放这些临时数据,那就是显存了。

  我们在显示屏上看到的画面是由一个个的像素点构成的,而每个像素点都以4至32甚至64位的数据来控制它的亮度和色彩,这些数据必须通过显存来保存,再交由显示芯片和CPU调配,最后把运算结果转化为图形输出到显示器上。显存和主板内存一样,执行存贮的功能,但它存贮的对像是显卡输出到显示器上的每个像素的信息。显存是显卡非常重要的组成部分,显示芯片处理完数据后会将数据保存到显存中,然后由RAMDAC(数模转换器)从显存中读取出数据并将数字信号转换为模拟信号,最后由屏幕显示出来。

显示存储器有两种存储模式

  • 一种是图形模式,图形点阵是直接存放在显示存储器中,因而图形与位置可以以象素为单位在屏幕上任意定位,可以任意改变其形状和大小,但编辑修改比较麻烦。
    在图形模式下,最基本的操作单元为单个象素点,一定的象素分辨率及一定的色彩表示方式即构成了一种图形显示模式。

  • 另一种是字符模式,此时显示存储器中存放的是字符的编码(如ASCII码或汉字代码)及其属性(如闪烁、加亮等),其字形的点阵信息一般存放在只读存储器(称字符发生器)中,显示器工作时,通过从显示存储器中读出的字符代码和CRTC提供的扫描线号码,从字符发生器中读出字形信息,送CRT去显示,如图6-15所示。这种模式比较容易编辑修改显示存储器中的内容。
    在字符模式下,最基本的操作单元为字符,一屏所能显示字符的行数和列数及字符属性的表示方法即构成了一种具体的字符显示模式。

VGA显示模式

字符显示原理

  荧光屏上显示的字符是由点阵图形构成的。

  Windows 里的文字,不是“文本”吗?答案是:对你来说,它是。可是对电脑来说,它就不是文本了。Windows 里的文本,也是图形。那些文字是被 Windows “画”出来的。打开控制面板里的“字体”,你看到了什么?种类繁多的字体是吧。这些都不是存放在显卡里的,而是在硬盘上。当 Windows 接收到在窗口上打印一行字的命令的时候,它会调度“画”字程序,从硬盘里读出字体,然后画到屏幕上来。现在就明了了:Windows 的界面是完全基于图形的。所以图形加速卡对于 Windows 来说是十分重要的。好了,现在,让我们忘掉“文本”吧!

  荧光屏上欲显示的字符,预先存在存储器中的一个特定区域,这个区域称显示存储器。在显示存储器中存储的是字符的ASCII码。显示存储器的内容与CRT显示的画面是一一对应的。将显示存储器中存储的ASCII码,变换成屏幕上5×7点阵图形,需要进行适当的变换。

  若显示字形“R”,就需要将R的ASCII码52H (即1010010)2变换成了7个线代码。字符发生器就是用来完成这个变换的器件。常用的字符发生器由ROM构成。

图形显示原理

  图形的显示过程应该从硬件和软件两个方面来说。就硬件方面来说,当电子束扫描到屏幕上某一像素的位置(坐标)时,显示器中的显示处理器 dpu(display processing unit)会同时从对应的显示缓冲单元中取出像素值,并以此查找彩色表的地址,从该地址处得到该像素的红、绿、蓝三基色分量,经d/a转换后分别控制三基 色电子枪,使屏幕上该像素显示出三基色的混合色。在图2示例中,彩色表的红、绿分量分别为15,而蓝分量为0,因此,屏幕上该像素的颜色会是黄色。

  其中显示存储器是整个显示器的核心,它存放着需要在屏幕上显示出来的图形的映象(Image),更确切地说,显示存储器中存放了与屏幕画面上的每一点(象素点)一一对应的象素值。这些象素值在显示存储器中所构成的映象图称之为位图(Bitmap)。为了使CRT屏幕上的图形能持续地显示,显示存储器的内容需要不断地反复读出并送到CRT进行扫描显示,以便使画面能以一定的频率进行刷新。

  图形的显示过程应该从硬件和软件两个方面来说。就硬件方面来说,当电子束扫描到屏幕上某一像素的位置(坐标)时,显示器中的显示处理器dpu(display processing unit)会同时从对应的显示缓冲单元中取出像素值,并以此查找彩色表的地址,从该地址处得到该像素的红、绿、蓝三基色分量,经d/a转换后分别控制三基色电子枪,使屏幕上该像素显示出三基色的混合色。在图2示例中,彩色表的红、绿分量分别为15,而蓝分量为0,因此,屏幕上该像素的颜色会是黄色。

  就软件方面来说,要完成图形显示的初始化及图形的加工。这里,初始化的意思是要将计算机的显示方式设置为显示器所能够显示的某一种模式,并将所有的显示缓冲单元清零,另外,对彩色表的每一个单元要分别填上预定的颜色值,使彩色索引与具体的颜色联系起来。

  图形加工则是图形软件的主要任务,其主要内容是:根据需要显示的图形内容,随时改写显示缓冲单元的内容。这是因为屏幕上显示的图形是由显示卡上显示缓冲区中的内容唯一决定的。一旦在显示缓冲单元中写入要求的彩色索引值,图形就自然在屏幕上显示出来了。

这里写图片描述

八、第六个问题:涉及到显示,必然用到显示器,显示器是如何工作的?

  这里只讲述阴极射线管(CRT)显示器的工作原理。

  阴极射线管(CRT)显示器一直是计算机上最主要的显示装置。

  其工作过程为:电子枪发射出电子束,电子束首先经过聚焦装置得到聚焦,然后电子束通过水平垂直偏转装置改变发射方向,最后电子束轰击到荧光屏表面 的某一点上,使该点处的荧光粉发光从而在屏幕上呈现出一个亮点。电子枪发射出的电子束的强弱决定了该点的亮度,施加在偏转装置上的电压则决定了该点的位 置。

九、给自己的经验和启发

  1. 基础很重要,开始阅读《编码》,《深入理解计算机系统》。
  2. 分层的思考方式
      编程知识金字塔三层,自己的计算机系统这块理解的不深。
  3. 深感基础知识薄弱带来的问题:这里涉及计算机图形学、组成原理、计算机网络的知识。需要补补基础。
  4. 未来学习声音、视频这块内容,肯定还会有其他的封装类来调用系统底层和声卡显卡相关的api。

十、回到开头的问题

  涉及显示的时候,都要把内存中的数据映射成显存中的数据,我们使用字符没事,是因为字符在显存中也是存的asc码,而图片在显存中存放的是位图数据(即象素值)。

  更确切地说,显示存储器中存放了与屏幕画面上的每一点(象素点)一一对应的象素值。这些象素值在显示存储器中所构成的映象图称之为位图(Bitmap)。

  图片显示时,从显示存储器中读出的位图数据(即象素值),经过查彩色表后,转换成红、绿、蓝三原色的亮度值(在不使用彩色表的显示器中,象素值直接就是三原色的亮度值)。

  因此只要涉及图片的显示,不同语言或系统都会提供这些库和方法,便于你把字节文件转化成位图文件,送到显存中。java如是,android如是,c++如是。

十一、又一个小问题

  问题是从内存中的字节数组到显存不是计算机帮你主动完成的吗?

  可以从计算机的工作原理看,比如打开一个图片,其实用的就是一个图片阅读程序。计算机的cpu发送指令让显存读取数据,然后显示,这里的java程序也没有浏览图片的软件,你必须自己主动的调用系统底层的api来写入显存,这些功能已经被各种语言封装到自己的包里了,android的bitmap,其实实现底层还是调用的系统底层的api。

十二、致谢

  问题解决的过程中,谢谢百度知道的回答,知乎的回答,还有很多的博客,都给了我很多的启发和思考,本文引用非常多的网络资料,把他们的地址列在下面,表示感恩:

http://blog.sina.com.cn/s/articlelist_1738048783_0_2.html

http://www.zhihu.com/question/21231074


推荐阅读
author-avatar
丁扣其
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有