RGB888 和 RGB565

来源:互联网 发布:php连接mysqli代码 编辑:程序博客网 时间:2024/06/05 10:37

今天作练习,是一个将RGB888的图像转换成RGB565在ARM 的 LCD上显示的小程序。里面的移位来移位去的完全不了。先是不管三七二是一,把程序运行了一下。图像是一行一行刷出来的,点是一个一个一行一行转换再画的。因为开始不明白的地方,我加了几条printf,于是就那个刷屏啊~~~

源程序:

#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <fcntl.h>#include <math.h>#include <sys/mman.h> #include <string.h>#define DEVICE_NAME "/dev/fb0"#define XSIZE   320#define YSIZE   240unsigned short int *fb_mem_kernel;          //16bitstatic void PutPixel(unsigned int x,unsigned int y,unsigned short color);unsigned int size = XSIZE*YSIZE*2;int main(void){FILE *img_fp;int fp, i, j; unsigned char red32, green32, blue32, x32, red565, green565, blue565;unsigned short rgb565;fp = open("/dev/fb0", O_RDWR);fb_mem_kernel=mmap(0,size,PROT_READ | PROT_WRITE, MAP_SHARED,fp,0);memset(fb_mem_kernel,0x00,size);img_fp = fopen("test32.bmp","r");fseek(img_fp, 0x36L, SEEK_SET);for(j=YSIZE;j>0;j--){//rgb32 to rgb 565for(i=0;i<XSIZE;i++){fread(&blue32,sizeof(unsigned char),1,img_fp);fread(&green32,sizeof(unsigned char),1,img_fp);fread(&red32,sizeof(unsigned char),1,img_fp);printf("blue32=0x%x,green32=0x%x,red32=0x%x.\n",blue32,green32,red32);red565 = red32 >> 3; // 5-bit red   printf("red565=0x%x.\n",red565);green565 = green32 >> 2; // 6-bit green   blue565 = blue32 >> 3; // 5-bit blue   rgb565 = blue565 + (green565<<5) + (red565<<(5+6));PutPixel(i,j,rgb565) ;fread(&x32,sizeof(unsigned char),1,img_fp);//对rgb32格式而言,空读一次}}fclose(img_fp);close(fp);munmap(fb_mem_kernel,size);return 0;}static void PutPixel(unsigned int x,unsigned int y,unsigned short color){    if ((x <= XSIZE) && (y <= YSIZE)){        *(fb_mem_kernel+(y-1)*XSIZE+(x-1))=color;    }}

对于里面不太懂的几个函数,查了一下:

int fseek(FILE *stream, long offset, int fromwhere);

函数设置文件指针stream的位置。如果执行成功,stream将指向以fromwhere(偏移起始位置:文件头0,当前位置1,文件尾2)为基准,偏移offset(指针偏移量)个字节的位置。如果执行失败(比如offset超过文件自身大小),则不改变stream指向的位置。

offset可能取值为: SEEK_SETSEEK_CUR、 SEEK_END 依次为0,1和2.


size_t fread(void*buffer,size_tsize,size_tcount,FILE*stream); 

参 数:
1.用于接收数据的地址(指针)(buffer)
2.单个元素的大小(size) :单位是字节而不是位,例如读取一个int型数据就是4个字节
3.读取size个字节的次数(count)
4.提供数据的文件指针(stream)
返回值:读取的元素的个数

=========================RGB===============================

24bit RGB888 -> 16bit RGB565 的转换

  24ibt RGB888 R7 R6 R5 R4 R3 R2 R1 R0 G7 G6 G5 G4 G3 G2 G1 G0 B7 B6 B5 B4 B3 B2 B1 B0

  16bit RGB656 R7 R6 R5 R4 R3 G7 G6 G5 G4 G3 G2 B7 B6 B5 B4 B3

具体量化压缩与量化补偿的介绍请看RGB888和565相互转换(这篇博文也是被转载的,不知道原文章在哪里,感谢原作者,也感谢将这个说明推广的这位朋友)