I/O应用之24位真彩BMP文件的读取

 

众所周知,我们所有的数据在电脑上都是以“010101”的二进制形式存储的。BMP文件格式是windows中广泛使用的图片文件格式。

如果想要读取BMP格式的图片,首先就要了解bmp文件的数据存储方式。bmp文件按数据排列先后顺序由bmp文件头、位图信息头、调色板、位图数据四部分组成。其中:

    bmp文件头:提供文件格式、大小等数据,占用14字节



 

    位图信息头:提供图像尺寸、压缩方式等数据,占用40字节。如图:



 

 

    调色板:索引与其对应颜色的映射表

    位图数据:图像的数据,由图像尺寸决定。

下面我们通过一个具体的24位真彩bmp文件的数据来了解一下它的数据存储方式。



 这是我用UltraEdit软件打开的bmp文件。上图是其数据开始部分的截图,数据是16进制(每两个数字代表一个字节)我用黑线将所有的数据分成了三部分,第一部分即前十四位是bmp文件头,其中:

(1-2字节)42 4D是说明文件的类型;

 (3-6字节)A6 11 00 00是该位图文件的大小;

(7-10字节)00 00 00 00保留部分,必须设为0;

(11-14字节)36 00 00 00文件开始到位图数据的偏移量;

,第二部分是位图信息头,其中:

(1-4字节)28 00 00 00 位图信息头的长度;

(5-8字节)粉色部分:2F 00 00 00 图像的宽度;

(9-12字节)画蓝色部分:1F 00 00 00 图像的高度;

(13-14)01 00:颜色平面数,其值总被设为1;

(15-16)18 00:说明像素

(17-20)00 00 00 00:图像压缩的类型,因为bmp是无压缩的文件所以本数据为0;

 (21-24)70 11 00 00:图像大小;

(25-28)00 00 00 00 ;像素水平分辨率;

(29-32)00 00 00 00 ;像素垂直分辨率;

(33-36)00 00 00 00 :位图使用的颜色数,为0表示使用所有颜色板;

(37-40)00 00 00 00:指定重要的颜色数,为0表示都重要

 

因为是24位真彩图所以并不存在调色板;

第三部分是位图数据,每个像素占一个字节,取得相应的字节,以此字节索引颜色,在显示器中显示出来就好了!

 

了解了bmp的数据存储方式之后,我们可以发现其实bmp文件的读取非常简单,只要能够获得图像的尺寸,然后进行遍历就可以得到颜色数据,再通过打点的形式就可以读取一张bmp图片啦!此外,应注意的是

1.bmp文件有一个对齐规则,即每行的数据都是4的倍数如果不够就用bit(0)填充。

2.bmp文件是从左下角向右上角读取的。

 

public class IOpic {
	private JFrame jf;
	private Graphics g;
	private int wight,height;//画板的宽与高
	Border b2;
	File filename;//文件名
	public IOpic(Graphics g) {
		this.g=g;
	}
	
	/**
	 * 将byte数组转换成int数组
	 * b: 要转换的字节数组,start 字符截止的位置:
	 */
	public int changeint(byte[] b,int start){
		int ch1= b[start]&0xff;
		int ch2= b[start+1]&0xff;
		int ch3= b[start+2]&0xff;
		int ch4= b[start+3]&0xff;
		int ch=ch1|ch2|ch3|ch4;

		return (ch);
	}
	
	/**
	 * 读取BMP图片的方法
	 * 输入流
	 * @throws Exception
	 */
	public void readpic(File filename) throws Exception{
		System.out.println(filename);
		FileInputStream fis =new FileInputStream(filename);
		DataInputStream dis=new DataInputStream(fis);
		//创建字节数组,并将字节存储在此数组中
		byte[] array1=new byte[14];
		byte[] array=new byte[40];
		dis.read(array1, 0, 14);
		dis.read(array, 0, 40);
		wight=changeint(array, 4);
		height=changeint(array, 8);
		System.out.println("图形的宽度是:"+wight+",图形的高度是:"+height);
		//画出图片
		//装颜色数据的数组
		if (wight*3/4!=0) {
			int wid = 4 - (wight * 3) % 4; 
			int[][] R=new int[height][wight];
			int[][] B=new int[height][wight];
			int[][] G=new int[height][wight];
			for (int i = height-1; i >=0; i--) {
				for (int j = 0; j < wight; j++) {
					int blue=dis.read();
					int green=dis.read();
					int red=dis.read();
					R[i][j]=red;
					B[i][j]=blue;
					G[i][j]=green;
				}
				dis.skipBytes(wid);
				
			}
			
			
			//循环加入数据,用点打出来
			for(int i=0;i<height;i++){
				for (int j = 0; j < wight; j++) {
							System.out.println(R[i][j]+"  "+B[i][j]+"  "+G[i][j]);
							g.setColor(new Color(R[i][j],G[i][j],B[i][j]));
							g.drawLine(i+100,j+100,i+100,j+100);
				}
			}
			
		}
		
		

 

 总结:

1、通过对bmp图片文件的读取,我对io更加的了解,也更加明白了作为流的特性,io利用java实现对文件的输入与输出。如果要读取一段数据流中间的数据必须要读出该数据前面的数据。

2、所谓文件的协议就是文件之间之间的对接及了解,已达到互相转换的目的。

 

 

 

BMP文件格式详解及利用C读取24位真彩色图片信息 BMP文件格式详解 你必须要懂得几点 BMP(Bitmap、位图) 位数:1、4、8、16、24(RGB真彩色)、32(RGBA[透明度]真彩色),指的是表示一个像素所用的bit位数。 在BMP文件中,如果一个数据需要用几个字节来表示的话,那么该数据的存放字节顺序为“低地址存放低位数据,高地址存放高位数据”。如数据0x1756在内存中从小到大存储为: 0x77 0x78 0x5... 阅读详情

相关推荐

字节对齐在24位bmp图像读取中的使用

1 文件格式 典型的BMP图像文件由四部分组成。 1>位图文件头数据结构,它包含BMP图像文件的类型、显示内容等信息; 2>位图信息数据结构,它包含有BMP图像的宽、高、压缩方法以及定义颜色等信息; 3>调色板,这个部分是可选的,有些位图需要调色板,有些位图,比如真彩色图(24位的BMP)就不需要调色板; 4>位图数据,这部分的内容根据BMP位图使用的位数不同而不同,在24位图中直接

weiyongtao87的专栏 4534

BMP格式详解

BMP(全称Bitmap)是Windows操作系统中的标准图像文件格式,可以分成两类:设备相关位图(DDB)和设备无关位图(DIB),使用非常广。它采用位映射存储格式,除了图像深度可选以外,不采用其他任何压缩,因此,BMP文件所占用的空间很大。BMP文件的图像深度可选lbit、4bit、8bit及24bit。BMP文件存储数据时,图像的扫描方式是按从左到右、从下到上的顺序。由于BMP文件格式是Wi

Valineliu 7万+

C++ 读取raw文件并保存为到bmp图片下

上篇文章,写了如何读取光谱图片raw,本文就解决,如何把保存的像素值保存为BMP图片格式。    关于bmp文件格式,网上有很多,不再赘述。我们需要做的只是修改相关信息头,然后填充数据就可以了,本代码实现的是24真彩色显示,即不带调色板,R,G,B三个分量都显示同一波段的像素值。这个可以得到一个波段的图像。调整相关系数,就可以得到16个波段的图像。做这个,主要还是为了以后图像处理可以更方便的看到

as784089306的博客 1万+

BMP图像读取

0. BMP格式介绍 根据百度百科对BMP的定义,我们知道BMP是Bitmap(位图)的简称,是Windows操作系统中的标准图像文件格式。其特点是由于几乎不进行压缩,所以包含的图像信息较丰富,但同时也到之占用的磁盘空间较大。 1 文件格式 位图文件由4个部分组成: 位图头文件(bitmap-file header) 位图信息头(bitmap-information header) 颜色表(color table):使用索引来表示图像,此时颜色表就是索引与其对应的颜色之间的映射表(即通过索引值,

hello_dear_you的博客 6006

24位真彩色转换为8位灰度图片(完整代码)

#include &amp;lt;windows.h&amp;gt; #include&amp;lt;iostream&amp;gt; using namespace std; BOOL BMP24to8(char *szSourceFile,char *szTargetFile); int main(int argc,char* argv[]) { //调用这个函数直接把24位真彩色灰度化 BOOL st...

dange4的博客 4872

C/C++ BMP(24位真彩色)图像处理(2)------图像の截取

对上一篇博客《图像处理模板---针对bmp图像数据区的操作和输出处理完成图像》

weixinhum 3709

24位bmp图像的数据读取&存储

24位bmp文件的读取&amp;amp;存储 我采用的方法是将图像文件读取,存储到一维数组中,以便后期的操作。    void checkFileExist(FILE * fpbmp) {     //打开图片文件 按照二进制读取     if (fpbmp == NULL)     {         printf(&quot;当前打开的文件不存在!\n&quot;);         exit(1);     }...

wennyLee的博客 2408

C/C++ BMP(24位真彩色)图像处理(1)------图像の打开与数据区处理

在图像处理过程中,通常以MATLAB代码进行模拟,

weixinhum 9190

BMP图像的读写处理

最近一段时间我学习了计算机图像处理这门课程,通过这门课程的学习,我了解到了图片具有灰度和彩色的区别,并且通过具体的代码可以将一些图片数据进行读写与转化。 第一部分:BMP图像的读写 1.BMP图像的读: (1)首先定义BMP文件头和信息头变量BITMAPFILEHEADER bf; //BMP文件头结构体BITMAPINFOHEADER bi; //BMP信息头结构体 (2)创建文件输入流 fp fp=fopen(fileName,“rb”); //fileName为BMP图像文件名 (3)读取信息.

zzjjqq666的博客 6341

C++实现24位位图像素数据的BMP文件保存

BMP文件格式最显著的特征是其存储简单直观,它包含图像文件头、图像信息头、颜色表(对于索引颜色模式)和位图数据。这些部分按照顺序排列,为不同的图像处理软件提供了足够的信息来准确显示和处理图像。BMP文件有固定的结构,包括文件头、信息头、颜色表和像素数据等部分。我们可以定义结构体来表示这些信息。#pragma pack(push, 1) // 确保结构体成员按照1字节对齐// 假设已经从BMP文件中读取了fileHeader和infoHeader的数据。

weixin_31163455的博客 1231

AGX Orin 部署PyTorch与Torchvision 2026避坑指南

本文提供了2026年在AGX Orin开发板上部署PyTorch与Torchvision的详细避坑指南。针对ARM64架构和JetPack 6.2系统,重点解决了Python 3.10环境配置、官方wheel包安装、torchvision源码编译等关键步骤,并分享了常见问题解决方案和性能优化技巧,确保深度学习环境稳定运行。

sky77的博客 752

24位和32位.bmp文件实现图像旋转

对24位和32位.bmp文件的简单操作

Tiddlik的博客 2102

FortiOS路径遍历漏洞CVE-2022-41328实战复现:从环境搭建到漏洞利用全记录

本文深入解析FortiOS路径遍历漏洞CVE-2022-41328,从漏洞背景、影响范围到技术原理进行全面剖析。提供详细的漏洞复现环境搭建步骤和实战利用方法,并给出官方修复方案与临时缓解措施,帮助企业有效防御此类防火墙漏洞风险。

weixin_30485379的博客 524

java实现读写bmp文件(附带源码)

java实现读写bmp文件(附带源码)

欢迎来到我的博客!这里是一个专注于计算机技术的分享平台,涵盖编程开发、算法研究、系统架构、软件工程等多个领域。无论你是初学者还是资深开发者,都能在这里找到有价值的内容。 1786

EPICS电机支持(asynMotor)

EPICS电机支持(asynMotor)

yuyuyuliang00的博客 916

React 源码解析 | Reconcile协调过程

上篇讲了React的工作流程,这篇详细的讲一下render过程中的beginWork函数,也就是深度优先创建Fiber树中"递"的过程。beginWork函数传入当前已经创建好的Fiber节点,返回创建/复用的第一个子FIber节点,也就是wip.child在renderRoot中,在开始创建整棵FIber树之前,会先调用prepareRefreshStack创建/复用一个新的HostRootFiber。

weixin_40710412的博客 1220

完整24位真彩色位图灰度化源代码

<br />贴出来不为别的,就为万一以后硬盘出问题资料在网上还有个备份。<br /><br />//Code By xets007<br />//转载请注明出处<br />//<br />////////////////////////////////////////////////////////////////////////<br />#include <windows.h><br /><br />BOOL BMP24to8(char *szSourceFile,char *szTargetFile)

cherryli007的专栏 651

信创环境下,软件测试如何破局?

毕竟,在自主可控的道路上,每一行通过测试的代码,都在为信创产业的未来添砖加瓦。未来,测试工程师不仅要验证软件在信创环境的可用性,更要基于国产软硬件的特性,推动软件进行 “原生设计”—— 例如,针对国产 CPU 的多核架构优化代码,基于国产数据库的索引机制提升查询效率。某政务云平台的测试数据显示,在 “飞腾芯片 + 麒麟操作系统” 环境下,系统的并发处理能力较传统环境下降约 15%,测试团队通过优化软件的线程调度逻辑,最终将性能损失控制在 5% 以内 —— 这正是信创性能测试的价值所在。

weixin_45608163的博客 886

C语言bmp图片读取写入

一、介绍 bmp是我们常用的一种图片格式,这里用c语言写一个程序打开,读取像素点然后增亮 增亮公式 y = kx + b 二、实现 img_bmp.c #include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; // bmp图片头大小 24位深度的 #define BMP_HEADER_SIZE 54 void read_bmp (const char* filename, unsigned int** img_data, int *height, int *

锅锅的博客 4966

【软考高项】五十一、常见必会的几种进度网络图(单代号、双代号、七格图、横道图)

软考高项计算题进度网络图画图介绍

有莘不破的博客 3万+

【Linux命令大全】006.网络通讯之netstat命令(实操篇)

本文详细介绍了Linux系统中netstat网络诊断命令的实用技巧。主要内容包括:1) 基本功能与参数详解,展示如何查看网络连接、路由表和接口统计;2) 安装方法及基础用法,如查看TCP/UDP连接、显示进程信息和路由表;3) 高级应用技巧,包括监听端口检查、连接状态统计和实时监控。文章通过表格和代码示例,系统性地呈现了netstat在系统管理中的核心应用场景,是网络故障排查和性能监控的实用指南。

yuhuasheng1997的博客 708

24-Bit BMP Raster Data Tutorial & Grayscaling

Raster Data Tutorial (24-Bit) Author: Bill Green (2002) HOME EMAIL This tutorial assumes the reader knows: (1) Data is stored left to right and bottom to top in a BMP. (2) How to develop sour

数学屌丝走在it的道路上 2002

Thor芯片部署

英伟达Jetson Thor芯片性能分析与应用现状 摘要:英伟达最新发布的Jetson Thor芯片基于Blackwell架构,官方宣称AI算力达2070TFLOPS(FP4),较前代Orin提升7.5倍,配备14核Arm CPU和128GB内存。然而实际量产版算力缩水至700TOPS,且因4nm制程良率问题多次延期至2025-2026年交付。该芯片支持FP4/FP8量化、Transformer引擎等先进特性,适用于自动驾驶、机器人等边缘AI场景,但受供应链限制,国内厂商倾向自研方案。开发者可通过JetPa

xiaomu_347的博客 432

BMP序列转YUV文件

BMP文件格式: 典型的 BMP 图像文件由四部分组成: (1)位图头文件数据结构,它包含 BMP 图像文件的类型、显示内容等信息; (2)位图信息数据结构,它包含有 BMP 图像的宽、高、压缩方法,以及定义颜色等信 息; (3)调色板,这个部分是可选的,有些位图需要调色板,有些位图,比如真彩色图(24 位的 BMP)就不需要调色板; (4)位图数据,这部分的内容根据 BMP 位图使用的位数不同而不同,在 24 位图中直接 使用 RGB,而其他的小于 24 位的使用调色板中颜色索引值。 (1)位图文件头:

qq_43399224的博客 287

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

rotatebmp-24位 大作业 旋转bmp图像

rotatebmp-24位 思路 读表头 读入将图片像素信息 按照旋转坐标规则进行旋转 将新图片信息存入新图片 TIPS 有几个点注意一下: 主要是表头需要修改: 行列的数据 图的大小的数据(像素) 图的大小(像素 + 表头) 对齐struct,用#pragma pack(n)将struct大小按照n对齐。 code // rotatebmp // // Created by 风清扬 on 2021/4/11. // #include &lt;iostream&gt; #include &lt

Sanfeng_W的博客 985

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

上一篇: 数组队列 的简单实现
下一篇: Hadoop学习笔记之WordCount
rootke
博客等级 码龄12年 1粉丝 22原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值