有了IO流的基础之后,就可以写一些简单的关于BMP文件的操作程序了。
在实际生活中,我们经常看到或用到BMP格式的图片,那么,到底什么是BMP文件?
根据百度百科的介绍,BMP是一种与硬件设备无关的图像文件格式,使用非常广。它采用位映射存储格式,除了图像深度可选以外,不采用其他任何压缩,因此,BMP文件所占用的空间很大。BMP文件的图像深度可选lbit、4bit、8bit及24bit。BMP文件存储数据时,图像的扫描方式是按从左到右、从下到上的顺序。 由于BMP文件格式是Windows环境中交换与图有关的数据的一种标准,因此在Windows环境中运行的图形图像软件都支持BMP图像格式。
意思是说,BMP是一种通用型的图形图像文件保存格式。它的保存和读取时与硬件无关的,在任何操作系统中BMP的文件保存方式和格式都是相同的,真正做到了“跨平台”,所以BMP是一种用途很广的图像保存方式。window自带的画板就是画的BMP格式图片(当然,你可以将之转为别的图像格式)。
那么怎么保存和读取图片文件呢?
做过简单画板程序或者自定义图像保存读取的人都知道,我们要保存和读取一幅图(通常是我们自己画的),实际上保存的都是图像中的点。比如,我们用了Graphics g.fillLine(x1,y1,x2,y2);在画板上画了一条直线,那么我们只需要保存直线的2个端点(x1,y1)和(x2,y2)就行了。读取的时候,也是读取这二个点(也就是让程序知道这二个点),然后调用Graphics g.fillLine(x1,y1,x2,y2);来画这条直线就行了。
这就是保存和读取图片(不管是你自己的程序画的,还是别人的程序画的或者就是照片)的重点:怎样保存,就怎样读取。
但这样出现了一个问题,在一般的图片(比如照片)中是很少有那些规则的图形的,那么我们保存什么?很容易想到的是,我们可以保存图片上的点,而事实上BMP也是如此。
BMP文件时怎样保存的呢?
典型的BMP图像文件由四部分组成:
1:位图文件头数据结构,它包含BMP图像文件的类型、显示内容等信息;
2:位图信息数据结构,它包含有BMP图像的宽、高、压缩方法,以及定义颜色等信息;
3:调色板,这个部分是可选的,有些位图需要调色板,有些位图,比如真彩色图(24位的BMP)就不需要调色板;
4:位图数据,这部分的内容根据BMP位图使用的位数不同而不同,在24位图中直接使用RGB,而其他的小于24位的使用调色板中颜色索引值。
具体的数据类型和保存的单位可以自己上网查。
在简单的读取中,我们只需要知道BMP文件的宽度和高度、调色板(不设置就是24色,也就是说调色板都不需要用到,我就没用到)、位图数据(即每个点的颜色)即可。PS:我们甚至不用仔细到单个点的位置,因为图像是按规律储存的,我们也是按规律读取和重绘的。大家可以看我的代码。
还有一点,因为BMP是不失真保存,即一个点一个点的读取与重绘,注定会比较慢。
想提高读取重绘的速度,可以考虑用双缓冲(double_buffer)或多线程来绘制。如果您有更好的提高速度的方法,你可以给我留言,一起交流学习。
还有一点,用多线程的时候,因为多个线程是用同一画笔,即同一个Graphics来画的,会出现问题,我觉得我的解决方法是比较简单的(这也是我比较自豪的地方,哦也),大家可以看看我的代码
- BMP.rar (4.4 KB)
- 描述: 有2个文件有main(),其中一个是多线程的一条线一条线的读取,另一个是一个点一个点的读取,比较慢
- 下载次数: 8
分享到:
相关推荐
"IO-Link——智慧的通信技术" IO-Link是一种智能的通信技术,主要应用于工业自动化领域。它是一种串行数字通信协议,用于与传感器和执行器进行通信。IO-Link技术可以简化工业控制领域的底层设备连接,提供大量的...
在单片机的学习过程中,IO扩展技术和存储器映射扩展是至关重要的概念,尤其是在准备像蓝桥杯这样的专业竞赛时。这些技术可以帮助我们利用有限的单片机资源,实现更复杂的系统功能。以下是对这两个主题的详细解释: ...
本教程将聚焦于深度学习框架TensorFlow中的图片文件读取,这是许多图像处理和计算机视觉任务的基础。 首先,我们需要了解在TensorFlow中如何导入必要的库。在Python环境中,我们通常会导入`tensorflow`模块,并可能...
在实际应用中,这个库可能会被其他C++程序调用,以读取BMP图像作为输入,或者将处理后的图像数据保存为BMP格式。例如,它可能被用于图像处理项目,如图像缩放、旋转、滤波或颜色转换。 总的来说,"io_bmp.h"和"io_...
### JAVA IO操作总结——节点流和处理流 #### 一、概述 在Java中,输入/输出(Input/Output,简称IO)操作是一项非常重要的功能,它涉及到如何从不同的源读取数据以及如何向不同的目的地写入数据。Java IO体系主要...
标题"MCP23S17_spi扩展io_spi接口IO扩展_spi扩展io芯片_MCP23S17STM32_mcp23_"提到了几个关键概念,包括MCP23S17,SPI扩展IO,SPI接口,以及与STM32微控制器的关联。MCP23S17是一款由Microchip Technology制造的16位...
使用这个工具类,你可以方便地读取各种颜色深度的BMP图片,将其转换为Java可以操作的图像对象。在实际应用中,你可能还需要考虑图像的旋转、缩放、裁剪等几何处理,以及颜色空间转换、滤波等图像处理操作。这些都是`...
单片机学习是一个涵盖广泛领域的主题,而单片机的IO扩展是其中至关重要的一部分。在电子设备和自动化系统中,单片机(Microcontroller Unit,MCU)常常扮演着核心控制角色,它们通过输入/输出(Input/Output,简称IO...
"Multisim_简单IO口扩展实验_"这个主题旨在帮助学习者掌握如何在单片机系统中扩展I/O口,并编写数据输入输出程序。在实际应用中,单片机的I/O口数量往往无法满足所有需求,因此需要通过扩展来增加接口,以实现更多...
在C#编程中,对象的保存与读取是常见的数据持久化操作,这对于应用程序的状态保持、数据备份和恢复等场景至关重要。本主题将深入探讨如何在Windows Forms(WF)环境中,利用C#语言进行对象的直接保存与读取,以及...
《51单片机系列实验之IO接口扩展》是一份详尽的技术文档,重点在于讲解如何在51单片机上进行I/O接口的扩展,这对于深入理解和掌握单片机的外设操作具有重要意义。本文章将从实验背景、原理图分析、程序解读以及实际...
总结起来,"嵌入式实验2 单片机IO口——汽车灯光控制器"是一个结合理论与实践的学习项目,旨在教会学生如何使用单片机的IO端口控制外部设备,特别是模拟汽车灯光的控制。通过这个实验,参与者不仅可以掌握单片机的...
总之,“嵌入式实验1:单片机IO口——流水灯”是一个非常实用的学习起点,它能帮助你建立起对单片机基本功能的理解,为进一步探索嵌入式系统打下坚实的基础。在完成实验后,你可以尝试扩展实验,比如增加更多LED灯、...
本项目"android开发之文件操作——文件创建和文件读取"提供了相关的代码示例,帮助开发者理解和实践Android中的文件操作。 在Android中,文件操作主要通过java.io包下的类来实现,如File、FileInputStream、...
类的成员函数可能包括打开、保存、读取像素、写入像素等,每个函数对应上述的一个或多个步骤。类的实例化可以代表一个图像文件,通过对象方法进行操作。 总的来说,这个项目涉及了C++编程、图像处理、第三方库的...
本文主要探讨了单片机IO口扩展的方法,并以PIC16F877A单片机为基础,采用模拟开关芯片CD4066设计了一套多用IO口扩展方案。 首先,文章指出单片机因其体积小、低电压、低功耗、高性价比等优势,在现代家用及工业应用...
在Java编程语言中,读取文件是常见的任务之一,尤其对于处理文本文件,如TXT文件,以行为单位...在实际项目中,你可以根据需要扩展这个基础示例,例如添加异常处理,或者将读取的内容存储到数据结构中以便进一步处理。
这个压缩包文件“安卓Android源码——(游戏保存Stream).rar”显然是一个关于如何利用Stream来保存和读取游戏数据的示例源码。Stream在Java中是一种处理数据流的方式,它允许程序员以一种声明性方式处理数据,尤其...
实验报告的主题聚焦于“存储器和I/O扩展”,主要涵盖了两个关键领域:主存储器的扩展和串行接口的配置。以下是对这两个方面详细的知识点解释: **一、存储器扩展** 1. **存储器类型**:实验涉及两种类型的存储器...