嵌入式Linux开发,如何让LCD屏幕显示图片,有函数调用么?

嵌入式Linux开发,如何让LCD屏幕显示图片,有函数调用么?,第1张

两种实现,一是用 framebuffer,二是开 X 服务。

相对来说,低性能的嵌入式用 framebuffer 更好。如果性能好可以用 X 服务实现图形显示。前者基于内核的显示驱动,后者看 X 服务的驱动了。

X 服务可以跑很多软件不需要重新开发,但 c/s 架构效率不是很好。

framebuffer 是软件直接 *** 作硬件的存储器,性能实现比较好。但很多功能都要自己写代码实现。

显示图片在 fb 里面我要是没记错,就是把图片解码成你的软件支持的格式,之后把这部分数据写入 fb 内存。

怎么弄就别找我了。建议看看相关的开发文章。

还有就是 QT 库本身就有直接 fb 输出的函数库,GTK 似乎也有,但目前好像还不是完全可用。用他们作为过渡函数库还不错的。但要注意他们的软件协议!

参考:http://www.cnblogs.com/shengansong/archive/2011/09/23/2186409.html

http://code.google.com/p/libbmp/

说到图片,位图(Bitmap)当然是最简单的,它是Windows显示图片的基本格式,其文件扩展名为*.BMP。由于没有经过任何的压缩,故BMP图 片往往很大。在Windows下,任何格式的图片文件都要转化为位图格式才能显示出来,各种格式的图片文件也都是在位图格式的基础上采用不同的压缩算法生 成的。

一、下面我们来看看位图文件(*.BMP)的格式。

位图文件主要分为如下4个部分:

块名称

 对应Windows结构体定义大小(Byte)

文件信息头 BITMAPFILEHEADER  14

位图信息头 BITMAPINFOHEADER  40

颜色表(调色板)RGBQUAD (可选)

位图数据(RGB颜色阵列) BYTE* 由图像长宽尺寸决定

1.文件信息头BITMAPFILEHEADER

结构体定义如下:

typedef struct tagBITMAPFILEHEADER {

UINT bfType

DWORD bfSize

UINT bfReserved1

UINT bfReserved2

DWORD bfOffBits

} BITMAPFILEHEADER

其中:

bfType 表示文件的类型,该值必需是0x4D42,也就是字符'BM'。

bfSize 表示该位图文件的大小,用字节为单位

bfReserved1 保留,必须设置为0

bfReserved2 保留,必须设置为0

bfOffBits 表示从文件头开始到实际的图象数据之间的字节的偏移量。这个参数是非常有用的,因为位图信息头

和调色板的长度会根据不同情况而变化,所以你可以用这个偏移值迅速的从文件中读取到位数据。

2、位图信息头BITMAPINFOHEADER

结构体定义如下:

typedef struct tagBITMAPINFOHEADER {

DWORD biSize

LONG biWidth

LONG biHeight

WORD biPlanes

WORD biBitCount

DWORD biCompression

DWORD biSizeImage

LONG biXPelsPerMeter

LONG biYPelsPerMeter

DWORD biClrUsed

DWORD biClrImportant

} BITMAPINFOHEADER

其中:

biSize表示BITMAPINFOHEADER结构所需要的字节数。

biWidth 表示图象的宽度,以象素为单位。

biHeight 表示图象的高度,以象素为单位。注:这个值除了用于描述图像的高度之外,它还有另一个用处,就是指明该图像是倒向的位图,还是正向的位图。

如果该值是一个正数,说明图像是倒向的,如果该值是一个负数,则说明图像是正向的。大多数的BMP文件都是倒向的位图,也就是时,高度值是一个正数。

biPlanes为目标设备说明位面数,其值将总是被设为1。

biBitCount 表示比特数/象素,其值为1、4、8、16、24、或32。但是由于我们平时用到的图像绝大部分是24位和32位的,所以我们讨论这两类图像。

biCompression 表示图象数据压缩的类型,同样我们只讨论没有压缩的类型:BI_RGB。

biSizeImage表示图象的大小,以字节为单位。当用BI_RGB格式时,可设置为0。

biXPelsPerMeter表示水平分辨率,用象素/米表示。

biYPelsPerMeter表示垂直分辨率,用象素/米表示。

biClrUsed 表示位图实际使用的彩色表中的颜色索引数(设为0的话,则说明使用所有调色板项)。

biClrImportant 表示对图象显示有重要影响的颜色索引的数目,如果是0,表示都重要。

3、颜色表RGBQUAD:

颜色表用于说明位图中的颜色,它有若干个表项,每一个表项是一个RGBQUAD类型的结构,定义一种颜色。 这个部分是可选的,有些位图需要颜色表,有些位图,比如真彩色图(24位的BMP)就不需要颜色表,因为位图中的RGB值就代表了每个象素的颜色。但是16位r5g6b5位域彩色图像需要颜色表。

RGBQUAD结构的定义如下:

typedef struct tagRGBQUAD {

BYTE rgbBlue// 蓝色的亮度(值范围为0-255)

BYTE rgbGreen// 绿色的亮度(值范围为0-255)

BYTE rgbRed// 红色的亮度(值范围为0-255)

BYTE rgbReserved// 保留,必须为0

} RGBQUAD

位图信息头和颜色表组成位图信息,BITMAPINFO结构定义如下:

typedef struct tagBITMAPINFO {

BITMAPINFOHEADER bmiHeader// 位图信息头

RGBQUAD bmiColors[1]// 颜色表

} BITMAPINFO

而文件信息头和位图信息组成位图文件,BITMAPFILE结构定义如下:

typedef struct tagBITMAP

{

BITMAPFILEHEADER bfHeader

BITMAPINFO biInfo

}BITMAPFILE

4. 位图数据(RGB颜色阵列)

位图数据记录了位图的每一个像素值,记录顺序是:扫描行内是从左到右,扫描行之间是从下到上。位图的一个像素值所占的字节数:

当biBitCount=1时,8个像素占1个字节

当biBitCount=4时,2个像素占1个字节

当biBitCount=8时,1个像素占1个字节

当biBitCount=24时,1个像素占3个字节

当biBitCount=32时,1个像素占4个字节

Windows规定一个扫描行所占的字节数必须是4的倍数(即以long为单位),不足的以0填充。

这部分就是图片真正的数据,比如一张图片的大小为800*600,则该部分数据的长度就应该为800*600像素,也即800*600*24/8字节(如果是24位的图片,即一个像素用24bit来存储,每个像素点上有3个字节,分别用来表示b,g,r的颜色)。

有关RGB三色空间我想大家都很熟悉,这里我想说的是在Windows下,RGB颜色阵列存储的格式其实BGR。也就是说,对于24位的RGB位图像素数据格式是:

蓝色B值

绿色G值

红色R值

对于32位的RGB位图像素数据格式是:

蓝色B值

绿色G值

红色R值

透明通道A值

透明通道也称Alpha通道,该值是该像素点的透明属性,取值在0(全透明)到255(不透明)之间。对于24位的图像来说,因为没有Alpha通道,故整个图像都不透明。

二.根据对BMP格式的说明,我们可以轻易的写出一个生成BMP图像的函数:

首先需要位图数据,然后加上文件信息头和位图信息头就可以构成一张BMP图片了。

注意1:biBitCount与颜色表

biBitCount=1 表示位图最多有两种颜色,缺省情况下是黑色和白色,你也可以自己定义这两种颜色。图像信息头装调色板中将有两个调色板项,称为索引0和索引1。图象数据阵列中的每一位表示一个象素。如果一个位是0,显示时就使用索引0的RGB值,如果位是1,则使用索引1的RGB值。

biBitCount=4 表示位图最多有16种颜色。每个象素用4位表示,并用这4位作为彩色表的表项来查找该象素的颜色。例如,如果位图中的第一个字节为0x1F,它表示有两个 象素,第一象素的颜色就在彩色表的第2表项中查找,而第二个象素的颜色就在彩色表的第16表项中查找。此时,调色板中缺省情况下会有16个RGB项。对应 于索引0到索引15。

biBitCount=8 表示位图最多有256种颜色。每个象素用8位表示,并用这8位作为彩色表的表项来查找该象素的颜色。例如,如果位图中的第一个字节为0x1F,这个象素的颜色就在彩色表的第32表项中查找。此时,缺省情况下,调色板中会有256个RGB项,对应于索引0到索引255。

biBitCount=16 表示位图最多有65536种颜色。每个色素用16位(2个字节)表示。这种格式叫作高彩色,或叫增强型16位色,或64K色。它的情况比较复杂,当 biCompression成员的值是BI_RGB时,它没有调色板。16位中,最低的5位表示蓝色分量,中间的5位表示绿色分量,高的5位表示红色分 量,一共占用了15位,最高的一位保留,设为0。这种格式也被称作555 16位位图。如果biCompression成员的值是BI_BITFIELDS,那么情况就复杂了,首先是原来调色板的位置被三个DWORD变量占据, 称为红、绿、蓝掩码。分别用于描述红、绿、蓝分量在16位中所占的位置。在Windows 95(或98)中,系统可接受两种格式的位域:555和565,在555格式下,红、绿、蓝的掩码分别是:0x7C00、0x03E0、0x001F,而 在565格式下,它们则分别为:0xF800、0x07E0、0x001F。你在读取一个像素之后,可以分别用掩码“与”上像素值,从而提取出想要的颜色 分量(当然还要再经过适当的左右移 *** 作)。在NT系统中,则没有格式限制,只不过要求掩码之间不能有重叠。(注:这种格式的图像使用起来是比较麻烦的,不 过因为它的显示效果接近于真彩,而图像数据又比真彩图像小的多,所以,它更多的被用于游戏软件)。

biBitCount=24 表示位图最多有1670万种颜色。这种位图没有调色板(bmiColors成员尺寸为0),在位数组中,每3个字节代表一个象素,分别对应于颜色R、G、B。

biBitCount=32 表示位图最多有2^32种颜色。这种位图的结构与16位位图结构非常类似,当biCompression成员的值是BI_RGB时,它也没有调色板,32 位中有24位用于存放RGB值,顺序是:最高位—保留,红8位、绿8位、蓝8位。这种格式也被成为888 32位图。如果 biCompression成员的值是BI_BITFIELDS时,原来调色板的位置将被三个DWORD变量占据,成为红、绿、蓝掩码,分别用于描述红、 绿、蓝分量在32位中所占的位置。在Windows 95(or 98)中,系统只接受888格式,也就是说三个掩码的值将只能是:0xFF0000、0xFF00、0xFF。而在NT系统中,你只要注意使掩码之间不产 生重叠就行。(注:这种图像格式比较规整,因为它是DWORD对齐的,所以在内存中进行图像处理时可进行汇编级的代码优化(简单))。

注意2:字节补齐

位图数据记录了位图的每一个像素值,记录顺序是:扫描行内是从左到右,扫描行之间是从下到上。且Windows规定一个扫描行所占的字节数必须是4的倍数(即以long为单位),不足的以0填充,所以向文件中写入的位图数据的大小应该为:

每行图像的字节数:bmppitch = ((biWidth * bitCountPerPix + 31) >>5) <<2

例如:一张24位10*10的图片,一行图像10个像素,共30字节,由于Windows规定一个扫描行所占的字节数必须是4的倍数,而不足的以0填充, 所以一行图像在文件中实际存储了32个字节(补了2字节的0);而图片总的大小就不是54+30*10=354字节,而是54+32*10=374字节。 (见图:24-10-10.bmp)

所以:1. 在生成BMP文件时,如果一行图像的字节数不是4的倍数,则补0,而补后一行图像数据的大小的计算公式为:

bmppitch = ((biWidth * bitCountPerPix + 31) >>5) <<2

其中,biWidth--图片的宽度,bitCountPerPix--图片的位数。

1) 在LCD上显示BMP或JPEG图片的主流程图

首先,在程序开始前。要在nfs/dev目录下创建LCD的设备结点,设备名fb0,设备类型为字符设备,主设备号为29,次设备号为0。命令如下:

mknod fb0 c 29 0

在LCD上显示图象的主流程图如图1所示。程序一开始要调用open函数打开设备,然后调用ioctl获取设备相关信息,接下来就是读取图形文件数据,把图象的RGB值映射到显存中,这部分是图象显示的核心。对于JPEG格式的图片,要先经过JPEG解码才能得到RGB数据,本项目中直接才用现成的JPEG库进行解码。对于bmp格式的图片,则可以直接从文件里面提取其RGB数据。要从一个bmp文件里面把图片数据阵列提取出来,首先必须知道bmp文件的格式。下面来详细介绍bmp文件的格式。

图1

2) bmp位图格式分析

位图文件可看成由四个部分组成:位图文件头、位图信息头、彩色表和定义位图的字节阵列。如图2所示。

图2

文件头中各个段的地址及其内容如图3。

图3

位图文件头数据结构包含BMP图象文件的类型,显示内容等信息。它的数据结构如下定义:

Typedef struct

{

int bfType;//表明位图文件的类型,必须为BM

long bfSize;//表明位图文件的大小,以字节为单位

int bfReserved1;//属于保留字,必须为本0

int bfReserved2;//也是保留字,必须为本0

long bfOffBits;//位图阵列的起始位置,以字节为单位

} BITMAPFILEHEADER;

2.1)信息头中各个段的地址及其内容如图4所示。

图4

位图信息头的数据结构包含了有关BMP图象的宽,高,压缩方法等信息,它的C语言数据结构如下:

Typedef struct {

long biSize; //指出本数据结构所需要的字节数

long biWidth;//以象素为单位,给出BMP图象的宽度

long biHeight;//以象素为单位,给出BMP图象的高度

intbiPlanes;//输出设备的位平面数,必须置为1

intbiBitCount;//给出每个象素的位数

long biCompress;//给出位图的压缩类型

long biSizeImage;//给出图象字节数的多少

long biXPelsPerMeter;//图像的水平分辨率

long biYPelsPerMeter;//图象的垂直分辨率

long biClrUsed;//调色板中图象实际使用的颜色素数

long biClrImportant;//给出重要颜色的索引值

} BITMAPINFOHEADER;

2.2)对于象素小于或等于16位的图片,都有一个颜色表用来给图象数据阵列提供颜色索引,其中的每块数据都以B、G、R的顺序排列,还有一个是reserved保留位。而在图形数据区域存放的是各个象素点的索引值。它的C语言结构如图5所示。

图5 颜色表数据结构

2.3)对于24位和32位的图片,没有彩色表,他在图象数据区里直接存放图片的RGB数据,其中的每个象素点的数据都以B、G、R的顺序排列。每个象素点的数据结构如图6所示。

图6 图象数据阵列的数据结构

2.4)由于图象数据阵列中的数据是从图片的最后一行开始往上存放的,因此在显示图象时,是从图象的左下角开始逐行扫描图象,即从左到右,从下到上。

2.5)对S3C2410或PXA255开发板上的LCD来说,他们每个象素点所占的位数为16位,这16位按B:G:R=5:6:5的方式分,其中B在最高位,R在最低位。而从bmp图象得到的R、G、B数据则每个数据占8位,合起来一共24位,因此需要对该R、G、B数据进行移位组合成一个16位的数据。移位方法如下:

b >>= 3g >>= 2r >>= 3

RGBValue = ( r<<11 | g <<5 | b)

基于以上分析,提取各种类型的bmp图象的流程如图7所示

图7

3) 实现显示任意大小的图片

开发板上的LCD屏的大小是固定的,S3C2410上的LCD为:240*320,PXA255上的为:640*480。比屏幕小的图片在屏上显示当然没问题,但是如果图片比屏幕大呢?这就要求我们通过某种算法对图片进行缩放。

缩放的基本思想是将图片分成若干个方块,对每个方块中的R、G、B数据进行取平均,得到一个新的R、G、B值,这个值就作为该方块在LCD屏幕上的映射。

缩放的算法描述如下:

(1)、计算图片大小与LCD屏大小的比例,以及方块的大小。为了适应各种屏幕大小,这里并不直接给lcd_width和lcd_height赋值为240和320。而是调用标准的接口来获取有关屏幕的参数。具体如下:

// Get variable screen information

if (ioctl(fbfd, FBIOGET_VSCREENINFO, &vinfo)) {

printf("Error reading variable information. ")

exit(3)

}

unsigned int lcd_width=vinfo.xres

unsigned int lcd_height=vinfo.yres

计算比例:

widthScale=bmpi->width/lcd_width

heightScale=bmpi->height/lcd_height

本程序中方块的大小以如下的方式确定:

unsigned int paneWidth=

unsigned int paneHeight=

符号 代表向上取整。

(2)、从图片的左上角开始,以(i* widthScale,j* heightScale)位起始点,以宽paneWidth 高paneHeight为一个小方块,对该方块的R、G、B数值分别取平均,得到映射点的R、G、B值,把该点作为要在LCD上显示的第(i , j)点存储起来。

这部分的程序如下:

//-------------取平均--------

for( i=0i<now_heighti++)

{

for(j=0j<now_widthj++)

{

color_sum_r=0

color_sum_g=0

color_sum_b=0

for(m=i*heightScalem<i*heightScale+paneHeightm++)

{

for(n=j*widthScalen<j*widthScale+paneWidthn++)

{

color_sum_r+=pointvalue[m][n].r

color_sum_g+=pointvalue[m][n].g

color_sum_b+=pointvalue[m][n].b

}

}

RGBvalue_256->r=div_round(color_sum_r,paneHeight*paneWidth)

RGBvalue_256->g=div_round(color_sum_g,paneHeight*paneWidth)

RGBvalue_256->b=div_round(color_sum_b,paneHeight*paneWidth)

}

}

4) 图片数据提取及显示的总流程

通过以上的分析,整个图片数据提取及显示的总流程如图8 所示。

图 8

图像显示应用程序:

#include <errno.h>

#include <sys/types.h>

#include <sys/stat.h>

#include <fcntl.h>

#include <sys/ioctl.h>

#include <unistd.h>

#include <stdint.h>

#include <stdio.h>

#include <stdlib.h>

#include <asm/types.h>

#include <linux/videodev2.h>

#include <sys/mman.h>

#include <string.h>

#include <malloc.h>

#include <linux/fb.h>

#include <jpeglib.h>

#include <jerror.h>

struct fb_dev

{

//for frame buffer

int fb

void *fb_mem //frame buffer mmap

int fb_width, fb_height, fb_line_len, fb_size

int fb_bpp

} fbdev

//得到framebuffer的长、宽和位宽,成功则返回0,失败返回-1

int fb_stat(int fd)

{

struct fb_fix_screeninfo fb_finfo

struct fb_var_screeninfo fb_vinfo

if (ioctl(fd, FBIOGET_FSCREENINFO, &fb_finfo))

{

perror(__func__)

return (-1)

}

if (ioctl(fd, FBIOGET_VSCREENINFO, &fb_vinfo))

{

perror(__func__)

return (-1)

}

fbdev.fb_width = fb_vinfo.xres

fbdev.fb_height = fb_vinfo.yres

fbdev.fb_bpp = fb_vinfo.bits_per_pixel

fbdev.fb_line_len = fb_finfo.line_length

fbdev.fb_size = fb_finfo.smem_len

return (0)

}

//转换RGB888为RGB565(因为当前LCD是采用的RGB565显示的)

unsigned short RGB888toRGB565(unsigned char red, unsigned char green, unsigned char blue)

{

unsigned short B = (blue >>3) &0x001F

unsigned short G = ((green >>2) <<5) &0x07E0

unsigned short R = ((red >>3) <<11) &0xF800

return (unsigned short) (R | G | B)

}

//释放framebuffer的映射

int fb_munmap(void *start, size_t length)

{

return (munmap(start, length))

}

//显示一个像素点的图像到framebuffer上

int fb_pixel(void *fbmem, int width, int height, int x, int y, unsigned short color)

{

if ((x >width) || (y >height))

return (-1)

unsigned short *dst = ((unsigned short *) fbmem + y * width + x)

*dst = color

return 0

}

int main(int argc, char **argv)

{

int fb

FILE *infile

struct jpeg_decompress_struct cinfo

int x,y

unsigned char *buffer

char s[15]

struct jpeg_error_mgr jerr

if ((fb = open("/dev/fb0", O_RDWR)) <0)//打开显卡设备

{

perror(__func__)

return (-1)

}

//获取framebuffer的状态

fb_stat(fb) //获取显卡驱动中的长、宽和显示位宽

printf("frame buffer: %dx%d, %dbpp, 0x%xbyte= %d\n",

fbdev.fb_width, fbdev.fb_height, fbdev.fb_bpp, fbdev.fb_size, fbdev.fb_size)

//映射framebuffer的地址

fbdev.fb_mem = mmap (NULL, fbdev.fb_size, PROT_READ|PROT_WRITE,MAP_SHARED,fb,0)

if ((infile = fopen("lcd.jpg", "rb")) == NULL)

{

fprintf(stderr, "open %s failed\n", s)

exit(-1)

}

ioctl(fb, FBIOBLANK,0) //打开LCD背光

cinfo.err = jpeg_std_error(&jerr)

jpeg_create_decompress(&cinfo)

//导入要解压的Jpeg文件infile

jpeg_stdio_src(&cinfo, infile)

//读取jpeg文件的文件头

jpeg_read_header(&cinfo, TRUE)

//开始解压Jpeg文件,解压后将分配给scanline缓冲区,

jpeg_start_decompress(&cinfo)

buffer = (unsigned char *) malloc(cinfo.output_width

* cinfo.output_components)

y = 0

while (cinfo.output_scanline <cinfo.output_height)

{

jpeg_read_scanlines(&cinfo, &buffer, 1)

if(fbdev.fb_bpp == 16)

{

unsigned short color

for (x = 0x <cinfo.output_widthx++)

{

color = RGB888toRGB565(buffer[x * 3],

buffer[x * 3 + 1], buffer[x * 3 + 2])

fb_pixel(fbdev.fb_mem, fbdev.fb_width, fbdev.fb_height, x, y, color)

}

}

else if(fbdev.fb_bpp == 24)

{

memcpy((unsigned char *)fbdev.fb_mem + y * fbdev.fb_width * 3, buffer,

cinfo.output_width * cinfo.output_components)

}

y++

}

//完成Jpeg解码,释放Jpeg文件

jpeg_finish_decompress(&cinfo)

jpeg_destroy_decompress(&cinfo)

//释放帧缓冲区

free(buffer)

//关闭Jpeg输入文件

fclose(infile)

fb_munmap(fbdev.fb_mem, fbdev.fb_size)//释放framebuffer映射

close(fb)

}

文章是我转载的http://blog.chinaunix.net/uid-25120309-id-3794265.html

但是测试发现编译无法通过,

报错:

LCD.C:(.text+0x384): undefined reference to `jpeg_std_error(jpeg_error_mgr*)'

LCD.C:(.text+0x3a0): undefined reference to `jpeg_CreateDecompress(jpeg_decompress_struct*, int, unsigned int)'

LCD.C:(.text+0x3b0): undefined reference to `jpeg_stdio_src(jpeg_decompress_struct*, _IO_FILE*)'

LCD.C:(.text+0x3c0): undefined reference to `jpeg_read_header(jpeg_decompress_struct*, int)'

LCD.C:(.text+0x3cc): undefined reference to `jpeg_start_decompress(jpeg_decompress_struct*)'

LCD.C:(.text+0x410): undefined reference to `jpeg_read_scanlines(jpeg_decompress_struct*, unsigned char**, unsigned int)'

LCD.C:(.text+0x59c): undefined reference to `jpeg_finish_decompress(jpeg_decompress_struct*)'

LCD.C:(.text+0x5a8): undefined reference to `jpeg_destroy_decompress(jpeg_decompress_struct*)'

collect2: ld returned 1 exit status

经过在网上查找,确定是JPEG解码库问题,我首先在Ubuntu安装了jpeg库

libjpeg 库的安装

在源文件里将

#include <jpeglib.h>

改成

extern "C" {

#include <jpeglib.h>

}

这里是有问题的,注意gcc 会把LCD.C当成c++编译,而把LCD.c当成C语言编译,改成lcd.c后就没有上边红色部分错误

由于是有的是JPEG解码库,链接的时候需要加上-ljpeg 选项

使用命令 arm-linux-gcc -ljpeg LCD.C -o LCD #add -ljpeg option 编译源文件成功,

文章知识点与官方知识档案匹配

CS入门技能树Linux入门初识Linux

23099 人正在系统学习中

点击阅读全文

打开CSDN,阅读体验更佳

开发板lcd上显示图片

#include #include #include "lcd.h" #include "regs.h" extern const unsigned char gImage_6[261120]//extern const unsigned char gImage_5[261120]extern const unsigned char gImage_a[83784]extern const unsigned char test[]static unsigned short drawb[272][480]//it is a public draw area unsigned char mask[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01}unsigned char mat[]={0x00,0x00,0x10,0x38, 0x6c,0xc6,0xfe,0xc6, 0xc6,0xc6,0xc6,0x00, 0x00,0x00,0x00,0x00 }

lcd屏幕显示bmp、jpg图片

文章目录BMP图片显示:jpeg压缩过程 RGB: ARGB 32bit 4Byte A:【24-31】 R:【16-23】 G:【8-15】 B:【0-7】 图片显示 显示思路: (1)打开液晶屏(open),进行内存映射(mmap) (2)打开图片,读取颜色数据 (3)将读取到的颜色数据映射到液晶屏 (4)关闭图片文件,液晶屏,解除内存映射 BMP图片显示: 没有经过压缩的二进制位图文件,文件较大,获取颜色数据方便 一张800*480的bmp格式的图片 8004803 = 1152000Byt

继续访问

最新发布 【正点原子I.MX6U-MINI应用篇】6、嵌入式Linux在LCD屏幕上显示字符

嵌入式Linux在LCD屏幕上显示字符

继续访问

数码相框(十六、LCD显示JPG格式图片)

注:本人已购买韦东山老师第三期项目视频,内容来源《数码相框项目视频》,只用于学习记录,如有侵权,请联系删除。 1. LCD 如何显示一张图片? 假如下图是是我们的 JZ2440 开发板,它有一个块显存、LCD控制器、LCD显示屏,LCD是如何显示张图片的呢? 如上图所示: ① 图片的颜色数据存放在显存,LCD 控制器会自动从显存取出图片的一个个颜色数据发送给LCD,取到最后又从头开始的循环取数据,最终把一张图片的全部颜色数据发送到LCD上,从而在LCD显示出该图片; ② 显存存放的数据是RGB数据;.

继续访问

linux滚动屏幕,基于MIDP1.0实现屏幕滚动(转)

本例介绍了一个常用的编程技巧,就是如何基于MIDP1.0实现屏幕的滚动效果。在MIDP2.0可以借助LayerManager的的“可视窗口”来实现。MIDP1.0通过变化坐标系来实现屏幕的滚动效果,只要借助Graphics.translate()方法。package com.j2medev.translateimport javax.microedition.midlet.*import ja...

继续访问

Linux系统LCD显示图片的原理,linux驱动开发:用户空间 *** 作LCD显示简单的图片【转】...

上一章我们简单介绍了LCD的一些基本原理。当然更深奥的还有,比如gamma,dither,HUE,satuation.OSD等等.我们知道我们是用framebuffer来实现显示的.显存:framebuffer.由DDRAM中划去一部分内存供显存使用.从而 *** 作lcd相当于 *** 作显存.lcd控制器(s5pv210里面有lcd控制器)会周期的获取framebuffer中的数据。经过处理丢给 显示屏的lc...

继续访问

linux中如何在fb上显示

framebuffer 帧缓冲 https://blog.csdn.net/readnap/article/details/83006523 帧缓冲(framebuffer)是Linux 系统为显示设备提供的一个接口,它将显示缓冲区抽象,屏蔽图像硬件的底层差异,允许上层应用程序在图形模式下直接对显示缓冲区进行读写 *** 作。用户不必关心物理显示缓冲区的具体位置及存放方式,这些都由帧缓冲设备驱动本身来完成。 framebuffer机制模仿显卡的功能,将显卡硬件结构抽象为一系列的数据结构,可以通过fra...

继续访问

如何让linux fb0显示命令行,linux – 如何将/ dev / fb0用作来自用户空间的控制台,或者将文本输出到它...

所以我有一个Palm Pre(原始P100EWW)模型,我启用了开发人员模式,并安装了Debian Squeeze chroot.效果很好.我计划将这个用于任何东西(bittorrent peer,web server)但是一部手机.我注意到我是否做了猫/ dev / urandom>/ dev / fb0它实际上将随机像素写入屏幕,直到生成设备错误上没有剩余空格.真棒,现在我可以使用显示...

继续访问

linux 如何查看fb中分辨率_linux下直接写framebuffer(fb0)的方式显示bmp图像

linux下的显示设备就是/dev/fb0,往该设备写入的数据会显示在屏幕上,所以我们可以通过直接写frame buffer这个/dev/fb0设备来实现bmp图像的显示,而不用管是在shell文本方式下还是在其他gnome、qt、gtk、wayland等图形模式下,都能显示出来。当前前提是你的linux下必须具有该设备并支持读写(无特殊处理的linux都有该设备)。代码(支持16位、24位或32...

继续访问

Linux下LCD编程(fb设备_console_汉化)

http://blog.csdn.net/leichelle/article/details/7417367

继续访问

如何改造 Linux 虚拟终端显示文字

CJKTTY 补丁是什么,为什么我写了它 当你不使用 X 的时候,打开电脑,你就在使用虚拟终端。这么多年来它工作的很好,直到它来到了中国。包含中文字符的文件名无法正确显示,中文文档无法阅读。当然可以使用 X , 但是我为什么不能让终端也能显示汉字呢?如果在 X 下我能让屏幕显示汉字,终端下一定也能。为此我开始了 internet 上的搜寻。 我找到了 fbterm,这是个可以利用 /dev/

继续访问

LCD图片显示、触摸屏、音乐播放、缩放图片和播放视频

讲解LCD的原理和mmap函数,BMP格式图片的的显示,触摸屏的概念和原理以及触摸屏输入的解读,以及音乐视频播放和图片缩放。

继续访问

undefined reference to `jpeg_std_error(jpeg_error_mgr*)

背景 linux + QT BMP图片转JPG #include <jpeglib.h>编译错误: root@happy-virtual-machine:/home/happy/Lee/Detector2# make arm-linux-g++ -Wl,-O1 -Wl,-rpath,/opt/qt-4.7.1/lib -o Detector2 main.o...

继续访问

linux屏幕滑动效果实现代码,使用swipe方法模拟屏幕滑动与手势密码绘制

前言App自动化测试中有两个很重要的 *** 作,屏幕滑动与绘制手势密码。目前很多App在启动时,都存在启动时的引导动画或者加载上下文内容时需要手动上滑或者下滑加载页面,所以在自动化测试的过程中模拟手的滑动 *** 作看起来就很重要了;第二个比较重要的是模拟手动绘制九宫格完成手势密码的设置,这种手势密码在我了解的范围内,大多在金融类的app中最常见,还有一些对用户信息保密性较好的app中,所以,模拟绘制手势密码也...

继续访问

Linux下LCD图片放大缩小实现,仿QQ空间滑动图片放大缩小控件

先来看一下效果:scrollzoom_listview.gif一、设计思路与实现步骤1、本例是通过重写ListView来实现的,头部的图片是ListView的HeadView。定义一个headview.xml布局文件,在这个布局文件中放一个ImageView,并给IamgeView设置一个初始高度2、实现下拉图片放大当ListView处于顶部的时候下拉实现图片放大,这里要用的一个核心的方法是ove...

继续访问

无法解析的外部符号 jpeg_std_error

1>dlib.lib(png_loader.obj) : error LNK2001: 无法解析的外部符号 png_set_sig_bytes 1>dlib.lib(png_loader.obj) : error LNK2001: 无法解析的外部符号 png_sig_cmp 1>dlib.lib(png_loader.obj) : error LNK2001: 无法解析的外部符号...

继续访问

Linux LCD驱动(二)——图形显示

BMP和JPEG图形显示程序 1) 在LCD上显示BMP或JPEG图片的主流程图 首先,在程序开始前。要在nfs/dev目录下创建LCD的设备结点,设备名fb0,设备类型为字符设备,主设备号为29,次设备号为0。命令如下: mknod fb0 c 29 0 在LCD上显示图象的主流程图如图1所示。程序一开始要调用open函数打开设备,然后调用ioctl获取设备相关信息,接下来就是读取图形

继续访问

嵌入式Linux下完成LCD屏文字显示(帧缓冲框架)

帧缓冲框架是Linux下专门为显示类设备设计的接口,目的是将硬件和软件层分离开,方便应用层的编程,也方便应用层程序移植。帧缓冲框架向驱动层和应用层分别提供了一套标准接口,驱动层按照框架编写驱动,应用层按照框架编写应用程序。帧缓冲在/dev目录下生成的标准节点是fb,比如:/dev/fb0,/dev/fb1等等。

继续访问

linux 如何查看fb中分辨率_通过Linux FrameBuffer将像素绘制到屏幕上

最近,我对一个奇怪的想法感到震惊,他想从/ dev / urandom中获取输入,将相关字符转换为随机整数,然后使用这些整数作为像素rgb /xy值来绘制到屏幕上。我已经做过一些研究(在StackOverflow和其他地方),许多建议您可以直接直接写入/ dev /fb0,因为它是设备的文件表示形式。不幸的是,这似乎没有产生任何视觉上明显的结果。我找到了一个来自QT教程(不再可用)的示例C程序


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/8679039.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-19
下一篇2023-04-19

发表评论

登录后才能评论

评论列表(0条)

    保存