LCD如何显示图像
1、LCD显示主要相关概念
(1)像素(pixel)
整个图像是由一个个的像素组成的,像素就是一个显示点。像素就是组成图像的最基本元素,或者说显示中可以被控制的最小单位,整个图像就是由很多个像素组成的。
像素可以被单独控制,或控制其亮或不亮(单色屏)、或控制其亮度强弱(譬如亮50%,35%,这样叫灰度屏,以前的黑白电视机)、或控制其显示一定的颜色(这就
是我们现在最常用的彩色显示屏)。
总结:像素很重要,整个显示图像是由一个个的像素组成的。我们要在显示器上显示一个图像,就是把这个图像离散化成一个一个的点,然后把各个点的颜色对应在显示
器的像素上。
(2)像素间距(pitch)
pitch是连续2个像素的像素中心的距离。一般的像素是方形的,所以横向pitch和纵向的pitch一样的。但是也有不一样的。
像素间距会影响屏幕的最佳观看距离。像素间距大的适合远距离看,像素间距小的适合近距离看。
(3)分辨率(resolution)
整个屏幕的横向和纵向的像素个数就叫分辨率,譬如X210开发板用的屏幕是1024X600。
屏幕尺寸和分辨率无关的,像开发板的屏幕尺寸是7寸的(纯屏幕对角线尺寸是7英寸)。屏幕尺寸和分辨率和像素间距三者之间有关联。
(4)清晰度
清晰度是一个主观概念,是人眼对显示效果的一个主观判断。说白了就是人看起来感觉清晰不清晰。
客观来讲,清晰度由分辨率和像素间距共同决定。一般的,屏幕尺寸固定时分辨率越高越清晰,分辨率越低就越不清晰;分辨率固定下,屏幕尺寸越小越清晰,越大越不清晰。
清晰度还由其他很多因素共同决定。
(5)像素深度(bits per pixel,简称bpp)
一个像素的颜色在计算机中由多少个字节数据来描述。计算机中用二进制位来表示一个像素的数据,用来表示一个像素的数据位越多,则这个像素的颜色值更加丰富、分的更细,颜色深度就更深。
一般来说像素深度有这么几种:1位、8位、16位、24位、32位。下面会详细分析这些bpp所代表的含义。
(6)扫描
扫描是一个动作而不是一个名字,扫描就是依次将颜色数值放入屏幕中所有的像素的这个过程。
扫描这个词是由最早的CRT显示器遗留下来的,到LCD显示器的年代本来已经失去意义了,但是我们还是延续着这么叫。
显示器的扫描显示原理依赖于人眼的视觉暂留。只要显示器扫描频率大于人眼的发现频率,人眼看到的图像就是恒定的。如果扫描频率偏小人眼就会看到闪动。(扫描频率的概念就叫做刷新率)。
(7)驱动器&控制器
LCD驱动器一般和LCD显示面板集成在一起(本来是分开的,做面板的是只做面板的,譬如说三星、LG、台湾的友达、奇美都是做面板的;驱动器也由专门的IC厂商生产;集
成厂商买来面板和驱动器后集成在一起做成LCD屏幕),面板只负责里面的液晶分子旋转透光,面板需要一定的模拟电信号来控制液晶分子;LCD驱动器芯片负责给面板提供控制
液晶分子的模拟电信号,驱动器的控制信号(数字信号)来自于自己的数字接口,这个接口就是LCD屏幕的外部接口。
LCD控制器一般集成在SoC内部,他负责通过数字接口向远端的LCD驱动器提供控制像素显示的数字信号。LCD控制器的关键在于时序,它必须按照一定的时序和LCD驱动器通
信;LCD控制器受SoC控制,SoC会从内存中拿像素数据给LCD控制器并最终传给LCD驱动器。
(8)显示内存(简称:显存)
SoC在内存中挑选一段内存(一般来说是程序员随便挑选的,但是挑选的时候必须符
合一定规矩),然后通过配置将LCD控制器和这一段内存(以后称为显存)连接起来构成
一个映射关系。一旦这个关系建立之后,LCD控制器就会自动从显存中读取像素数据传输
给LCD驱动器。这个显示的过程不需要CPU的参与。
显示体系建立起来后,CPU就不用再管LCD控制器、驱动器、面板这些东西了;以后
CPU就只关心显存了,因为我只要把要显示的图像的像素数据丢到显存中,其他的显示过
程都是硬件自动完成的,不需要CPU干预,硬件就会自动响应(屏幕上就能自动看到显示
的图像了)。
总结:LCD显示是分为2个阶段的:第一个阶段就是建立显示体系的过程,目的就是CPU初
始化LCD控制器使其和显存联系起来构成映射;第二个阶段就是映射建立之后,此阶段主
要任务是将要显示的图像丢到显存中去。
2、颜色在计算机中的表示
(1)颜色的本质
颜色是主观存在,颜色其实是自然光在人的眼睛中和大脑中产生的一种映像。颜色的本质决定于光的波长。
(2)自然光的颜色是连续的
光的波长是连续的,导致颜色也是连续的。理论上,只要你的眼睛分辨能力足够好,可以在自然界中发现无数中颜色。
(3)计算机中的颜色是离散的
计算机中不可能存储无数种颜色,所以必须将颜色有限化,所以就用有限种颜色来代表自然界中的无限种颜色。这个理论非常类似于之前学过的AD转换。
种离散化表达颜色的缺点是不够真实,漏掉了很多种颜色。因此计算机中所能表达的颜色没有自然界中丰富(计算机屏幕上显示的图像和真实图像有差别)。
计算机所能表达的颜色种类个数,这个参数叫:像素深度bpp。
(4)常见的像素深度:1位、8位、16位、24位、32位
1位:用1个二进制位来表示颜色,这种就叫单色显示。示例就是小饭店、理发店门口的LED屏。
8位:用8个二进制位来表示颜色,此时能表示256种颜色。这种叫灰度显示。这时候是黑
白的,没有彩色,我们把纯白到纯黑分别对应255到0,中间的数值对应不同的灰。示例
就是以前的黑白电视机。
16位:用16个二进制位表示颜色,此时能表示65536种颜色。这时候就可以彩色显示了,
一般是RGB565的颜色分布(用5位二进制表示红色、用6位二进制表示绿色、用5位二进制
表示蓝色)。这种红绿蓝都有的颜色表示法就是一种模拟自然界中所有颜色的表示方式
。但是因为RGB的颜色表达本身二进制位数不够多(导致红绿蓝三种颜色本身分的都不够
细致),所以这样显示的彩色失真比较重,人眼能明显看到显示的不真实。
24位:用24个二进制位来表示颜色,此时能表示16777216种颜色。这种表示方式和16位
色原理是一样的,只是RGB三种颜色各自的精度都更高了(RGB各8位),叫RGB888。此时
颜色比RGB565更加真实细腻,虽然说比自然界无数种颜色还是少了很多,不过由于人眼
的不理想性所以人眼几乎不能区分1677万种颜色和无数种颜色的差别了。于是乎就把这
种RGB888的表示方法叫做真彩色。(RGB565就是假彩色)
32位:总共用32位二进制来表示颜色,其中24位表示红绿蓝三元色(还是RGB888分布)
,剩下8位表示透明度。这种显色方式就叫ARGB(A是阿尔法,表示透明度),现在PC机
中一般都用ARGB表示颜色。
补充:颜色的组成,三元色(三基色)是RGB,也就是说所有的颜色都可以由红绿蓝三种颜色组成。
3、颜色的编码方式
上面说的RGB其实是一种能够颜色的编码格式,大部分用的都还是这种。除此之外还有一些其他的颜色的编码格式,例如:YUV
(1)RGB
RGB色彩模式是工业界的一种颜色标准,是通过对红(R)、绿(G)、蓝(B)三个颜色通道的变化以及它们相互之间的叠加来得到各式各样的颜色的,RGB即是代表红、
绿、蓝三个通道的颜色,这个标准几乎包括了人类视力所能感知的所有颜色,是目前运用最广的颜色系统之一。
主要有16位表示RGB565、24位表示RGB888和32位表示的ARGB(A表示透明度)。
(2)YUV
YUV(亦称YCrCb)是被欧洲电视系统所采用的一种颜色编码方法(属於PAL)。
YUV,分为三个分量,“Y”表示明亮度(Luminance或Luma),也就是灰度值;而“U”和“V” 表示的则是色度(Chrominance或Chroma),作用是描述影像色
彩及饱和度,用于指定像素的颜色。与我们熟知的RGB类似,YUV也是一种颜色编码方法,主要用于电视系统以及模拟视频领域,它将亮度信息(Y)与色彩信息
(UV)分离,没有UV信息一样可以显示完整的图像,只不过是黑白的,这样的设计很好地解决了彩色电视机与黑白电视的兼容问题。并且,YUV不像RGB那样要
求三个独立的视频信号同时传输,所以用YUV方式传送占用极少的频宽。
主流的采样方式有三种,YUV4:4:4,YUV4:2:2,YUV4:2:0。
4、图像文件的编码格式
图像格式即图像文件存放的格式,通常有JPEG、TIFF、RAW、BMP、GIF、PNG等。
由于图像数据很大,因为对于一副源图像数据都会进行压缩之后再进行存储,也就是说上面的格式其实指的是图像数据的压缩格式。
同理,当我们的LCD需要对储存的一副图像进行显示时,则需要做相反的处理,先将数据进行解压,解压之后再丢到显存中去进行显示。
至于这些压缩格式算法什么的,我是一窍不通,当然如果工作当中有这个需求,那就得好好学学。
5、图片缩小和放大显示
(1)图片数据源本来是400×200的,但是显示时我希望显示成100×50的,这时候就要显
示函数后台对源图像进行先缩小,然后再显示。这时候就需要一个缩小算法。(譬如最
简单的算法就是抽点采样,当然还有更加高级的算法)
(2)图片数据源是100×50的,但是显示时希望全屏显示(800×480),这时候就需要对
源图像进行放大然后再显示(当然了显示出来图像清晰度肯定比较低),这时候就需要
一种放大算法(譬如插点方式,这也有更加高级的算法)
好了,今天的东西基本上不是我写的,我是从老师的课程笔记中整理出来的。
参考:《朱友鹏嵌入式Linux开发\1.ARM裸机全集\1.14.ARM裸机第十四部分-LCD显示器》
LCD如何显示图像的更多相关文章
- LCD与ARM,具体
一 实验内容简要描写叙述 1.实验目的 学会驱动程序的编写方法,配置S3C2410的LCD驱动,以及在LCD屏上显示包含bmp和jpeg两种格式的图片 2.实验内容 (1)分析S3c2410实验箱 ...
- LCD开发之汉字显示
一.LCD显示原理 利用液晶制成的显示器称为LCD,根据驱动方式可分为静态驱动.简单矩阵驱动以及主动矩阵驱动3种.当中,简单矩阵型又可再细分扭转向列型(TN)和超扭转式向列型(STN)两种,而主动矩阵 ...
- LCD驱动的学习
简介: LCD是基于液晶的. LCD(liquid crystal display)按驱动方式分类可以分为静态驱动,简单矩阵驱动,主动矩阵驱动.其中,简单矩阵又可以分为扭转向列型(TN)和超转向列型( ...
- i2c总线驱动,总线设备(适配器),从设备,从设备驱动的注册以及匹配
常用链接 我的随笔 我的评论 我的参与 最新评论 我的标签 随笔分类 ARM裸机(13) C(8) C++(8) GNU-ARM汇编 Linux驱动(24) Linux应用编程(5) Makefile ...
- 如何使用 pyqt 读取串口传输的图像
前言 这学期选修了嵌入式系统的课程,大作业选择的题目是人脸口罩检测.由于课程提供的开发板搭载的芯片是 STM32F103ZET6,跑不动神经网络,所以打算将 OV7725 拍摄到的图像通过串口传输给上 ...
- ARM2440 LCD实验
1. S3C2440内部LCD控制器结构图: 我们根据数据手册来描述一下这个集成在S3C2440内部的LCD控制器: a:LCD控制器由REGBANK.LCDCDMA.TIMEGEN.VIDPRCS寄 ...
- S3C2440 LCD驱动(FrameBuffer)实例开发<一>(转)
1. 背景知识 在多媒体的推动下,彩色LCD越来越多地应用到嵌入式系统中,PDA和手机等大多都采用LCD作为显示器材,因此学习LCD的应用很有实际意义! LCD工作的硬件需求:要使一块LCD正常的显示 ...
- 8位灰度图在LCD上显示
一.概述 1.灰度 灰度使用黑色调表示物体,即用黑色为基准色,不同的饱和度的黑色来显示图像.每个灰度对象都具有从 0%(白色)到灰度条100%(黑色)的亮度值. 使用黑白或灰度扫描仪生成的图像通常以灰 ...
- LCD驱动(FrameBuffer)实例开发讲解
一.开发环境 主 机:VMWare--Fedora 9 开发板:Mini2440--64MB Nand, Kernel:2.6.30.4 编译器:arm-linux-gcc-4.3.2 二.背景知识 ...
随机推荐
- 函数指针的一个demo
#include <stdio.h> typedef void (*fun_cb)(int a, int b); static fun_cb exe_fun_cb; void fun_cb ...
- 抓包工具PowerSniff-0.1
做这个程序的意图是wireshark插件编写复杂(虽然也支持lua),而轻量级的工具如smartsniff,minisniff不支持插件化数据分析,各种工具用下来或多或少不顺手.以前写的外挂也都是手工 ...
- 解决Selenium Webdriver执行测试时,每个测试方法都打开一个浏览器窗口的问题
虽然把WebDriver定义为一个静态变量了,但是每次执行测试都要打开多个窗口,挺浪费时间的. 找了很多中方法,比如使用setUpClass, BeforeSuite都没有完全解决问题.后来无意间发现 ...
- 一步步构建自己的AngularJS(1)——项目初始化
Angular1距离2009年发布已经好多年了,Angular2也已经出了Beta版,估计今年就能正式发布.大多数人对于Angular1.X的认识仅限于能够在项目中使用,对于其中的深层原理知道的并不多 ...
- IntelliJ 2016.02设置maven 阿里云加速
修改maven 的setting.xml <mirror> <id>nexus-aliyun</id> <mirrorOf>*</mirrorOf ...
- [Spring] - 动态设置properties
Spring的jar包用来做动态properties的getter/setter赋值方法: 1:需要的jar包: spring-beans-3.2.0.RC2.jar commons-logging- ...
- 【AT91SAM3S】英倍特串口示例工程05-UART中,串口是怎样初始化的
在这个示例工程的main.c文件中,进入main之后,没有发现串口功能的任何配置.直接使用了printf这个东西进行输出.将软件下载到开发板上之后,在电脑端使用串口软件,可以看板子有数据发来.说明这个 ...
- 【巩固】JS获取时间的一些基础知识
就是一个new Date()对象,要注意的有以下几点; 直接给oDate对象设置年月日时分秒的时候要分成两步,oDate.setFullYear()接受三个参数分别是年月日,注意月份是从0开始计一月的 ...
- 【转】前端精选文摘:BFC 神奇背后的原理
BFC 已经是一个耳听熟闻的词语了,网上有许多关于 BFC 的文章,介绍了如何触发 BFC 以及 BFC 的一些用处(如清浮动,防止 margin 重叠等).虽然我知道如何利用 BFC 解决这些问题, ...
- JDK源码包结构分类
最近查看JDK源码时,无意间发现几个类在陌生包里:com.sun.*.sun.*.org.*,google了一把总结了下以备他人搜索,如内容有误欢迎指正! Jre库包含的jar文件(jdk1.6) ...