仿真实例2——BMP图片文件读写

2024-05-31 20:48
文章标签 图片 仿真 实例 读写 bmp

本文主要是介绍仿真实例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图片文件读写的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1019014

相关文章

10. 文件的读写

10.1 文本文件 操作文件三大类: ofstream:写操作ifstream:读操作fstream:读写操作 打开方式解释ios::in为了读文件而打开文件ios::out为了写文件而打开文件,如果当前文件存在则清空当前文件在写入ios::app追加方式写文件ios::trunc如果文件存在先删除,在创建ios::ate打开文件之后令读写位置移至文件尾端ios::binary二进制方式

使用opencv优化图片(画面变清晰)

文章目录 需求影响照片清晰度的因素 实现降噪测试代码 锐化空间锐化Unsharp Masking频率域锐化对比测试 对比度增强常用算法对比测试 需求 对图像进行优化,使其看起来更清晰,同时保持尺寸不变,通常涉及到图像处理技术如锐化、降噪、对比度增强等 影响照片清晰度的因素 影响照片清晰度的因素有很多,主要可以从以下几个方面来分析 1. 拍摄设备 相机传感器:相机传

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss

基于UE5和ROS2的激光雷达+深度RGBD相机小车的仿真指南(五):Blender锥桶建模

前言 本系列教程旨在使用UE5配置一个具备激光雷达+深度摄像机的仿真小车,并使用通过跨平台的方式进行ROS2和UE5仿真的通讯,达到小车自主导航的目的。本教程默认有ROS2导航及其gazebo仿真相关方面基础,Nav2相关的学习教程可以参考本人的其他博客Nav2代价地图实现和原理–Nav2源码解读之CostMap2D(上)-CSDN博客往期教程: 第一期:基于UE5和ROS2的激光雷达+深度RG

【STM32】SPI通信-软件与硬件读写SPI

SPI通信-软件与硬件读写SPI 软件SPI一、SPI通信协议1、SPI通信2、硬件电路3、移位示意图4、SPI时序基本单元(1)开始通信和结束通信(2)模式0---用的最多(3)模式1(4)模式2(5)模式3 5、SPI时序(1)写使能(2)指定地址写(3)指定地址读 二、W25Q64模块介绍1、W25Q64简介2、硬件电路3、W25Q64框图4、Flash操作注意事项软件SPI读写W2

C++操作符重载实例(独立函数)

C++操作符重载实例,我们把坐标值CVector的加法进行重载,计算c3=c1+c2时,也就是计算x3=x1+x2,y3=y1+y2,今天我们以独立函数的方式重载操作符+(加号),以下是C++代码: c1802.cpp源代码: D:\YcjWork\CppTour>vim c1802.cpp #include <iostream>using namespace std;/*** 以独立函数

实例:如何统计当前主机的连接状态和连接数

统计当前主机的连接状态和连接数 在 Linux 中,可使用 ss 命令来查看主机的网络连接状态。以下是统计当前主机连接状态和连接主机数量的具体操作。 1. 统计当前主机的连接状态 使用 ss 命令结合 grep、cut、sort 和 uniq 命令来统计当前主机的 TCP 连接状态。 ss -nta | grep -v '^State' | cut -d " " -f 1 | sort |

Android 10.0 mtk平板camera2横屏预览旋转90度横屏拍照图片旋转90度功能实现

1.前言 在10.0的系统rom定制化开发中,在进行一些平板等默认横屏的设备开发的过程中,需要在进入camera2的 时候,默认预览图像也是需要横屏显示的,在上一篇已经实现了横屏预览功能,然后发现横屏预览后,拍照保存的图片 依然是竖屏的,所以说同样需要将图片也保存为横屏图标了,所以就需要看下mtk的camera2的相关横屏保存图片功能, 如何实现实现横屏保存图片功能 如图所示: 2.mtk

Spring MVC 图片上传

引入需要的包 <dependency><groupId>commons-logging</groupId><artifactId>commons-logging</artifactId><version>1.1</version></dependency><dependency><groupId>commons-io</groupId><artifactId>commons-

Prompt - 将图片的表格转换成Markdown

Prompt - 将图片的表格转换成Markdown 0. 引言1. 提示词2. 原始版本 0. 引言 最近尝试将图片中的表格转换成Markdown格式,需要不断条件和优化提示词。记录一下调整好的提示词,以后在继续优化迭代。 1. 提示词 英文版本: You are an AI assistant tasked with extracting the content of