在CCS3.3中,将电脑本地图片数据加载到C语言数组(内存)中,并显示出来

时间:2024-04-10 20:54:28

  在用CCS通过软件仿真对DSP的图像处理算法进行调试的时候,时常需要将本地的图片数据加载到数组中进行调试。需要现将图片数据转存到CCS能识别的.dat文件中,然后再用CCS加载.dat文件数据到内存中。下面一步一步的介绍。

1 将图片文件中的数据转存到.dat文件中

1.1 .dat文件的格式

  其中第一行数文件头,由五部分组成:

    固定标记:所有的.dat文件都是一样的

    数据格式:1-十六进制  2-十进制  3-十进制长整型  4-十进制浮点型

    内存地址:向内存中加载数据的时候表示内存的目的地址(可以在CCS中重新设定);将内存中的数据保存到文件中时,是数据的源地址

    页类型:0-数据   1-程序 

    长度:  文件中数据的长度(是用十六进制表示的,如这里的9000,实际是0x9000个数据,也就是36864个)

  从第二行开始,就是实际的数据了,每行代表一个数据,每个数据被加载到内存中后,占用4个Byte的内存空间。(例如图片中第二行的136,需要再内存中用一个int型数据保存)

  在CCS3.3中,将电脑本地图片数据加载到C语言数组(内存)中,并显示出来

1.2 图片数据转成.dat文件数据

  这里,我们用MATLAB编写代码实现这一功能。在MATLAB2013平台上的代码如下:

clear   
clc
[RGB,map]=imread('C:\Users\Administrator\Desktop\pictures\dog.jpg');  %读图
RGB = imresize(RGB,[96,128],'bicubic'); %图片resize成96*128
H=RGB;
figure,imshow(H);%显示彩色图像  
r=H(:,:,1);
g=H(:,:,2);
b=H(:,:,3); 
[M,N]=size(r);

fid=fopen('H:\RPG\Code\Algorithm\ThresholdOtsu\Debug\dog.dat','wt');   %打开一个文件写入数据

fprintf(fid,'%d %d %s %d %x\n',1651,2,'8cc0',0,N*M*3);
%写入二进制文件的第一行,CCS读入data数据第一行都为这种格式

%写入RGB成分
for i=1:M
    for j=1:N
    fprintf(fid,'%d\n',r(i,j));
    fprintf(fid,'%d\n',g(i,j));
    fprintf(fid,'%d\n',b(i,j));
    end
end
fclose(fid);

2 CCS加载.dat文件数据

2.1 在C语言代码中开辟一段大小合适的内存。

  下面是示例代码。注意:在这里直接先声明了一个int型数组和一个char型数组,int型数组用于存储.dat文件的数据,char型数组存储从int型转到char型的数据。

在CCS3.3中,将电脑本地图片数据加载到C语言数组(内存)中,并显示出来在CCS3.3中,将电脑本地图片数据加载到C语言数组(内存)中,并显示出来
 1 void main(void)
 2 {
 3     int img[36864];
 4     char img_rgb[36864];
 5     int i;
 6 
 7     for(i = 0; i < 36864; i++)
 8     {
 9         img_rgb[i] = img[i];
10         img_rgb[i] = img_rgb[i];
11     }
12 }
View Code

2.2 编译运行代码

  在simulator环境下编译运行代码,运行到代码的for循环处(注意,这是为了让img和img_rgb数组的声明动作完成,这里很重要,一定要让声明部分的代码被执行过,否则会出错

  在CCS3.3中,将电脑本地图片数据加载到C语言数组(内存)中,并显示出来

2.3 加载.dat数据

  存储用的数组被声明过后,就可以加载数据了。

  1)依次点击File-Data-Load,出现下面的窗口,注意,因为dog.dat文件的数据格式是十进制整形(文件头的第二个字段为2),所以此窗口的文件类型应该选择Integer(*.dat),然后选择要加载的文件。

  在CCS3.3中,将电脑本地图片数据加载到C语言数组(内存)中,并显示出来

  2)点击“打开”,出现下面的窗口,其中Address为内存中的目的地址,默认是.dat文件头的第三个字段规定的地址,可以手动更改,直接用数组名表示。在这里,要存在int型的img数组中,所以,输入img。Length是要加载数据的长度,默认是.dat文件头的第五个字段规定的长度,这里就保持默认,也可以根据实际情况更改。

  在CCS3.3中,将电脑本地图片数据加载到C语言数组(内存)中,并显示出来

  3)点击“OK”,在Memory窗口下可以看到,img指向的内存处的数据已经改变成.dat文件中的数据

  在CCS3.3中,将电脑本地图片数据加载到C语言数组(内存)中,并显示出来

  此时,导入已经完成,可以用img数组中的数据进行其他操作了。

2.4 以图片的形式显示数据 

  为了演示一下具体的效果,我们将int型的img数组中的数据转存成char型,并显示出来。 

  1)运行完for循环,将数据转存到char型的img_rgb数组中。

  在CCS3.3中,将电脑本地图片数据加载到C语言数组(内存)中,并显示出来

  2)现在开始将img_rgb中的数据以图片的形式显示出来。依次点击View-Graph-Image,出现下面的窗口。窗口中的个参数设置如图中所示。注意:其中,因为.dat中的数据是是按照RGBRGBRBG...的形式排列的,所以相应的在内存中每3个字节就表示一个像素的RGB值。所以Index Increment是3

  在CCS3.3中,将电脑本地图片数据加载到C语言数组(内存)中,并显示出来

  3)点击OK,img_rgb中的数据就能以图片的形式显示出来了

  在CCS3.3中,将电脑本地图片数据加载到C语言数组(内存)中,并显示出来

  至此,在CCS3.3中,将电脑本地的图片数据加载到内存中并显示的过程全部结束。上述过程是在仿真环境下进行的,实际硬件仿真时,操作完全一样。