bmp图片转换成16进制数据

您所在的位置:网站首页 图像转化为像素点阵 bmp图片转换成16进制数据

bmp图片转换成16进制数据

2024-07-16 16:09| 来源: 网络整理| 查看: 265

最近在开发中要在aboot中显示一张图片。但是发现aboot中显示图片不是直接拿图片文件来显示的,而是把一个16进制的数据序列依次往屏幕上搬运,就可以了。

那问题是,怎么把一张图片转换成16进制的数据序列?

在网上也找了一些资料,也咨询了一些同事,最后终于搞定,下面把相关的做法写下来备忘。

我们的aboot中显示方式只支持24bit bmp图片,所以要先看一下拿到的图片是不是这种格式。不是的话,就先用小画家或更高级的工具转成这种格式。然后,到ubuntu下运行命令:

xxd -i logo.bmp logo.h这个命令会把图片转换成16进制数字,写进一个头文件logo.h,这个头文件中会有一个数组,和一个表示数组长度(也就是bmp文件长度)的变量。

logo.h:

unsigned char logo_bmp[] = {   0x42, 0x4d, 0xde, 0xc9, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00,   0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x86, 0x00, 0x00, 0x00, 0x22, 0x01,   0x00, 0x00, 0x01, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,   0x00, 0x00, 0xc4, 0x0e, 0x00, 0x00, 0xc4, 0x0e, 0x00, 0x00, 0x00, 0x00,   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ... 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; unsigned int logo_bmp_len = 117214; 好了,已经拿到16进制的数据序列了,这就是我们要用的数据序列吗?不!还有好几步要做:

1. 了解bmp图片格式的知道,这个数组的前面一段是文件头信息,但是aboot中不需要这一段,所以要把它删除。

2. 另外,bmp图片如果每一行的字节数不是4的倍数,就会在每一行的最后添加若干字节空数据以对齐。这个空数据也要删除。

以 24bit bmp: 134X290 为例:

图片每一行134个像素,每个像素3个字节,所以每一行是134*3 == 402个字节,bmp会在每一行的最后添加两个字节来对齐。我们就要把这两个字节删除。

到这里可以了吗?还是没有,如果你试一下,就会发现,显示出来的图片是头向下倒过来的!因为bmp的数据就是从下往上存的。知道这一点,你可以一开始就在windows上把图片先做一个180度旋转,否则,就还要做下面两步处理:

3.反转整张图,即把数组的数组头尾互换一下。

4.做完步骤3,你会发现图片的颜色不对了!怎么回事? 是啊,R,B的位置也换了,R、G、B各占一个字节,所以还要每三个字节,就要把R和B的位置换一下。

好了,大功告成!

不过只是对左右对称的图片是可以的,如果左右不对称,则要先把图片转个180度,然后,只做上面的前两步,就可以了。

(其实旋转以后左右是反的,看下一篇:http://blog.csdn.net/jorney_dong/article/details/17419703)

下面看一下具体处理图片的代码:

main.c:

#include //TO_DO ++++++++ #include "logo.h" //bmp width, height int bytes_per_bpp = 3; int bmp_width = 134; int bmp_height = 290; unsigned int file_len = 117214; unsigned char *bmp_file_data = logo_bmp; #define REVERT_BMP 1 //revert the bmp: 1, don't revert: 0 //TO_DO -------- /*bmp文件的前部是文件头信息,aboot中画图不需要这些 * 1 删除文件头信息, * * 以 24bit bmp: 134X290 为例 * 图片每一行134个像素,每个像素3个字节,所以每一行是134*3 == 402个字节, * bmp会在每一行的最后添加两个字节对齐。 * aboot中要用这个图片的话, * 2.要把每行最后的两个对齐字节删除 * * 每行最后的两个字节删除以后 * 因为bmp本身的图片是倒的, * 3.反转整张图 * * 反转整张图以后,R和B也互换了,导致颜色不对 * R、G、B各占一个字节, * 4.这里是使其中的R 和 B互换。 * * 所以,如果把拿到手的图片先在windows上做一下180度的旋转, * 应该可以省略步骤3和4,把上面的 REVERT_BMP 设定为0 即可。 */ int main() { unsigned int i = 0; unsigned int j = 0; unsigned int bmp_info_len = 0; unsigned int temp = 0; unsigned int actual_data_len = 0; unsigned char result_arry[file_len]; unsigned char result_arry2[file_len]; unsigned int data_bytes_per_row = (bmp_width*bytes_per_bpp); unsigned int total_bytes_per_row = 0; unsigned int null_bytes_per_row = 0; unsigned int array_len = 0; if(data_bytes_per_row%4 != 0) { null_bytes_per_row = 4-data_bytes_per_row%4; } total_bytes_per_row = data_bytes_per_row + null_bytes_per_row;//total bytes per row bmp_info_len = file_len - total_bytes_per_row*bmp_height;//bmp file info len,or len to delete printf("file_len:---------------> %d \n",file_len); printf("bmp_info_len:-----------> %d \nnull_bytes_per_row:-----> %d\n",bmp_info_len,null_bytes_per_row); //1 删除文件头信息, for(i=bmp_info_len,j=0;i


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3