4.3寸TFTLCD显示JPG图片

说明

在JZ2440上显示自己的图片,全屏显示。已知分辨率是480*272,为了适应lcd的大小,又不使图片变形,需要对图片进行分辨率调整并裁剪,这里用到windows的自带画图工具。需要获得图片的像素数据,用python的PIL库对图片进行像素提取。

硬件平台

主板:JZ2440
主控芯片:S3C2440A
LCD型号:AT043TN24 V.1
分辨率:480x272
像素:24bpp
像素格式:0XRRGGBB

图片的裁剪

原始图片如下:
4.3寸TFTLCD显示JPG图片_第1张图片

分辨率为:4032*3024
打开画图工具,对图片进行裁剪,保持图片比例,将水平分辨率调整为480,则垂直分辨率变为360,如图所示:
4.3寸TFTLCD显示JPG图片_第2张图片

然后对图片进行矩形选择,选择480*272的尺寸:
4.3寸TFTLCD显示JPG图片_第3张图片
4.3寸TFTLCD显示JPG图片_第4张图片

然后点击【裁剪】,保存图片后就得到分辨率为480*272的图片。

用python提取图片的像素数据

将新图片命名为4.jpg,python代码如下:

from PIL import Image
img=Image.open("4.jpg","r")
print(img.size)
width,height=img.size
file = "hexbpp.txt"
out="const unsigned int bppColor[]=\n{\n"
for y in range(0,272):
    for x in range(0,480):
        r,g,b=img.getpixel((x,y))
        px=hex(r<<16|g<<8|b)
        out+=str(px)+","
    out+='\n'

out+="};\n"
with open(file,'w') as f:
    f.write(out)

生成的是.txt文件,不过可以直接生成.c文件,将这个.c文件添加到工程里并用头文件声明这个数组就可以用了。
注意:该数据文件比较大,内存较少的电脑代开容易卡顿。
python代码的编写参考这里:http://www.cnblogs.com/ningci/p/5203053.html
不过这个是python2的代码,需要做一些调整才能用。

显示图片的核心代码

void showPicture(void) {
	int x, y;
	fb_get_lcd_params();	//得到fb_base, xre, yrex, bpp数据
	for (y = 0; y < 272; y++) {
		for (x = 0; x < 480; x++) {
			fb_put_pixel(x, y, bppColor[y*xres + x]);
		}
	}
}
void fb_put_pixel(int x, int y, unsigned int color) {
	unsigned char *pc;	//8bpp, char
	unsigned short *ph;	//16bpp, halt word
	unsigned int *pw;	//32bpp, word

	unsigned int pixel_base = fb_base + (xres*bpp / 8)*y + x*bpp / 8;
	switch (bpp){
		case 8:	pc = (unsigned char *)pixel_base;	*pc = color; break;
		case 16:ph = (unsigned short *)pixel_base;	*ph = convert32bppto16bpp(color); break;
		case 32:pw = (unsigned int *)pixel_base;	*pw = color; break;
		default:break;
	}
}

这里没有24bpp的情形,因为对于32bpp和24bpp处理过程是一样的。

图片的显示效果

4.3寸TFTLCD显示JPG图片_第5张图片

注意事项

最后生成的bin文件有500多K,用EOP烧写的话需要好几分钟,非常不便于调试。可以改用uboot通过DNW下载,速度非常快,但是uboot下载出现的问题是文件太大,不能全部烧写进去。若上一次显示的是A图,这次要显示B图,则将B图的bin文件下载进去后,屏幕显示的是上半部分是B图下半部分是A图。

你可能感兴趣的:(嵌入式学习笔记)