本文主要是介绍仿真实例2——BMP图片文件读写,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
欲观原文,请君移步微信
BMP文件结构
BMP文件格式,又称为Bitmap(位图)它是一种图像文件格式。由于它可以不作任何变换地保存图像像素域的数据,因此我们经常使用它来保存RAW数据。BMP文件总体上由4部分组成,分别是位图文件头、位图信息头、调色板和图像数据,如下图所示
BMP文件格式
名称 | 描述 |
---|---|
位图文件头(bitmap-file header) | 包含BMP图像文件的类型、显示内容等信息 |
位图信息头(bitmap-information header) | 包含有BMP图像的宽、高、压缩方法,以及定义颜色等信息 |
彩色表/调色板(color table) | 这个部分是可选的,有些位图需要调色板,有些位图,比如真彩色图(24位的BMP)就不需要调色板 |
位图数据(bitmap-data) | 这部分的内容根据BMP位图使用的位数不同而不同,在24位图中直接使用RGB,而其他的小于24位的使用调色板中颜色索引值 |
读写BMP文件
下面先给出一个图片,鼠标右键查看图片的属性,看到图片分辨率为334x254,位深度为24bit
接下来进行文件的读写操作。
`timescale 1ns / 1ps
module bmp_file();integer fileID ;//读BMP图片文件的指针integer cc ;integer out_image ;//写BMP图片文件的指针integer out_file ;integer i ;//计数器integer j ;reg [7:0] rd_bmp_data [0:2100000] ;//读图片数据reg [7:0] wr_bmp_data [0:2100000] ;//写图片数据reg clk ;reg [7:0] rd_data ;//用于波形显示reg [7:0] wr_data ;//用于波形显示integer R_bmp_width ;//读出图片的宽度integer R_bmp_hight ;//读出图片的高度integer R_data_start_index ;//读出图片的宽度integer R_bmp_size ;/读出BMP文件的大小reg rd_en;reg wr_en;reg rst ;parameter CLK_PERIOD =5 ;parameter W_BMP_WIDTH =32'h014e ;// parameter W_BMP_WIDTH =32'd1920 ;parameter W_BMP_HIGHT =32'h00fe ;// parameter W_BMP_HIGHT =32'd1080 ;parameter PIXEL_BITS =16'h0018 ; //24bitsparameter PIXEL_BYTES =PIXEL_BITS/8 ; //3bytesparameter IMAGE_SIZE =((((W_BMP_WIDTH*PIXEL_BYTES)>>2)+1)<<2)*W_BMP_HIGHT ;parameter BMP_FILE_HEAD = 32'd54 ; parameter BM_WINDOWS = 16'h4d42 ;parameter FILE_SIZE =IMAGE_SIZE+BMP_FILE_HEAD ;initial beginclk =1'b0;#(CLK_PERIOD/2);forever#(CLK_PERIOD/2) clk = ~clk;endinitial beginrst = 1'b1;#2000rst=1'b0;endinitial begin//BMP文件地址,选择自己所需要的文件地址fileID = $fopen("F:\\file\\simulation_platform\\ImageSencorPipeline\\picture\\whiteandblack1.bmp","rb");out_image = $fopen("F:\\file\\simulation_platform\\ImageSencorPipeline\\picture\\output_file.bmp","wb");out_file = $fopen("F:\\file\\simulation_platform\\ImageSencorPipeline\\picture\\output_file.txt","w+");cc = $fread(rd_bmp_data,fileID);R_bmp_width = {rd_bmp_data[21],rd_bmp_data[20],rd_bmp_data[19],rd_bmp_data[18]};R_bmp_hight = {rd_bmp_data[25],rd_bmp_data[24],rd_bmp_data[23],rd_bmp_data[22]};R_data_start_index = {rd_bmp_data[13],rd_bmp_data[12],rd_bmp_data[11],rd_bmp_data[10]};R_bmp_size = {rd_bmp_data[5],rd_bmp_data[4],rd_bmp_data[3],rd_bmp_data[2]};wait(rst==1'b0);for(i=R_data_start_index;i<R_bmp_size;i=i+1)begin@(posedge clk)rd_en = 1'b1;wr_data = rd_bmp_data[i];end@(posedge clk)rd_en = 1'b0;//BMwr_bmp_data[0 ] = BM_WINDOWS[0+:8] ;wr_bmp_data[1 ] = BM_WINDOWS[8+:8] ;//bmp file sizewr_bmp_data[2 ] = FILE_SIZE[0 +:8] ;wr_bmp_data[3 ] = FILE_SIZE[8 +:8] ;wr_bmp_data[4 ] = FILE_SIZE[16+:8] ;wr_bmp_data[5 ] = FILE_SIZE[24+:8] ;//reservedwr_bmp_data[6 ] = 8'h00 ;wr_bmp_data[7 ] = 8'h00 ;wr_bmp_data[8 ] = 8'h00 ;wr_bmp_data[9 ] = 8'h00 ;//offsetwr_bmp_data[10] = BMP_FILE_HEAD[0 +:8] ; wr_bmp_data[11] = BMP_FILE_HEAD[8 +:8] ;wr_bmp_data[12] = BMP_FILE_HEAD[16+:8] ;wr_bmp_data[13] = BMP_FILE_HEAD[24+:8] ;//bmp information structwr_bmp_data[14] = 8'h28 ;wr_bmp_data[15] = 8'h00 ;wr_bmp_data[16] = 8'h00 ;wr_bmp_data[17] = 8'h00 ;//write bmp widthwr_bmp_data[18] = W_BMP_WIDTH[0+:8] ;wr_bmp_data[19] = W_BMP_WIDTH[8+:8] ;wr_bmp_data[20] = W_BMP_WIDTH[16+:8] ;wr_bmp_data[21] = W_BMP_WIDTH[24+:8] ;//write bmp hightwr_bmp_data[22] = W_BMP_HIGHT[0+:8] ;wr_bmp_data[23] = W_BMP_HIGHT[8+:8] ;wr_bmp_data[24] = W_BMP_HIGHT[16+:8] ;wr_bmp_data[25] = W_BMP_HIGHT[24+:8] ;//bit planeswr_bmp_data[26] = 8'h01 ;wr_bmp_data[27] = 8'h00 ;//one pixel use bitswr_bmp_data[28] = PIXEL_BITS[0+:8] ;wr_bmp_data[29] = PIXEL_BITS[8+:8] ;//compresswr_bmp_data[30] = 8'h00 ;wr_bmp_data[31] = 8'h00 ;wr_bmp_data[32] = 8'h00 ;wr_bmp_data[33] = 8'h00 ;//bmp image sizewr_bmp_data[34] = IMAGE_SIZE[0 +:8] ;wr_bmp_data[35] = IMAGE_SIZE[8 +:8] ;wr_bmp_data[36] = IMAGE_SIZE[16+:8] ;wr_bmp_data[37] = IMAGE_SIZE[24+:8] ;wr_bmp_data[38] = 8'hC4 ; wr_bmp_data[39] = 8'h0e ;wr_bmp_data[40] = 8'h00 ;wr_bmp_data[41] = 8'h00 ;wr_bmp_data[42] = 8'hC4 ;wr_bmp_data[43] = 8'h0e ;wr_bmp_data[44] = 8'h00 ;wr_bmp_data[45] = 8'h00 ;//use color boardwr_bmp_data[46] = 8'h00 ;wr_bmp_data[47] = 8'h00 ;//important color wr_bmp_data[48] = 8'h00 ;wr_bmp_data[49] = 8'h00 ;wr_bmp_data[50] = 8'h00 ;wr_bmp_data[51] = 8'h00 ;wr_bmp_data[52] = 8'h00 ;wr_bmp_data[53] = 8'h00 ;j=0;for(i=0;i<FILE_SIZE;i=i+1)beginif(j%(W_BMP_WIDTH*3)==0)begin //RGB888=24bitj=0;endrd_data[7:0]=wr_bmp_data[i];wr_en=1;if(i>=54) beginrd_data[7:0]=j/3;j=j+1;rd_data[7:0]=8'hff-rd_bmp_data[i];end @(posedge clk)// write image file$fwrite(out_image,"%c",rd_data[7:0]);//write data txt file$fwrite(out_file,"%d ",wr_bmp_data[i]);if(j%(W_BMP_WIDTH*3)==0)begin$fwrite(out_file,"\n");end endwr_en=0;$fclose(fileID);$fclose(out_image);$fclose(out_file);end
endmodule
现在已经完成BMP文件的读写操作,并且对图片进行了像素取反rd_data[7:0]=8’hff-rd_bmp_data[i];
图像结果
处理后的图片结果存放output_file.bmp,显示如下图
处理前和处理后结果对比
读写BMP文件显示波形如下图
获取工程
小编已经将读写BMP文件的工程放在了网盘上,话不多说来干货,下面给出链接。
工程链接 |
---|
百度网盘链接:https://pan.baidu.com/s/1uzDckGoEUk7NGwWm7jhXLw提取码:zpiq |
这篇关于仿真实例2——BMP图片文件读写的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!