串口传图的过程是一次把一个像素值传到SDRAM,并在VGA显示。因此这个像素值的不同就出现了两种串口传图方式:RGB332(一个像素值由一个8bit表示)、RGB565(一个像素值由两个8bit表示,其中第一个8bit是R5G3,第二个8bit是G3B5)。由于生活中大多数的图片是24bit,因此需要用matlab转换成一个个8bit的文本,包括这次工程用到的图片也是24bit的,因此需要转换成8bit。
串口传图工程示意图:
第一种传图方式RGB332:
①使用matlab将24bit图片生成8bit的像素值:
%-------------------------------------------------------------------------- %-- 图片数据转换:1个像素转换成1个 8bit hex 数据 %-------------------------------------------------------------------------- clear all; RGB24 = imread('G:image.jpg'); %读取图片文件 R = bitshift(RGB24(1:end,1:end,1),-5); %取R高3位,{5'b0,R[7:5]} G = bitshift(RGB24(1:end,1:end,2),-5); %取G高3位,{5'd0,G[7:5]} B = bitshift(RGB24(1:end,1:end,3),-6); %取B高2位,{6'd0,B[7:6]} rgb332 = bitshift(R,5) + bitshift(G,2) + B; %拼接{R[7:5],G[7:5],B[7:6]} fid=fopen('rgb332.txt','w+'); %打开文件 fprintf(fid,'%02x ',rgb332'); %将字符打印到txt文件中
之后会在自己建的rgb332文本中看到很多8bit的像素值。
②由于我的sdram还有vga显示都是16bit的,但是串口接收到的像素值是8bit,因此要把8bit拼接成16bit再给sdram。
③然后把程序下载到开发板,并把文本内容复制到串口调试助手中发送。串口速率115200是这里最大了,但是速度还是比较慢。
④结果:这种传图方式会导致图片质量不太好。
第二种传图方式RGB565:
①使用matlab将24bit图片生成8bit的像素值:
%-------------------------------------------------------------------------- %-- 图片数据转换:1个像素转换成2个 8bit hex 数据 %-------------------------------------------------------------------------- clear all; RGB24 = imread('G:image.jpg'); %读取图片文件 fid = fopen('rgb565.txt','w+'); %打开文件 [ROW,COL,N] = size(RGB24); %获得图片尺寸[高度,长度,维度] for i = 1:ROW for j = 1:COL RG = bitand(RGB24(i,j,1),248) + bitshift(RGB24(i,j,2),-5); %{R[7:3],3'd0} + {5'd0,G[7:5]} G = bitand(RGB24(i,j,2),28); %{3'd0,G[4:2],2'd0} GB = bitshift( G,3) + bitshift(RGB24(i,j,3),-3); %{G[4:2],5'd0} + {3'd0,B[7:3]} fprintf(fid,'%02x %02x ',RG,GB);%将字符打印到txt文件中 end end
之后会在自己建的rgb565文本中看到很多8bit的像素值。
②由于串口每次是把一个像素值发给sdram,这次是RGB565,所以两个8bit才构成一个像素值。因此这次需要把串口得到的两个8bit拼接成一个16bit再发给sdram。
③然后把程序下载到开发板,并把文本内容复制到串口调试助手中发送。串口速率115200是这里最大了,但是速度还是比较慢。
④结果:这种传图方式图片的质量还是很好的。