`

BMP图片——打开和保存

阅读更多

BMP的背后操作—以打开和保存为例

在使用windows的过程中,我们经常能见到bmp格式的图片,但是不知道系统是如何使用BMP图片的。
BMP图片的详细信息包括三个部分:
        信息头(14个字节)
        位图信息(40个字节)
        调色板(当位图=1,4,8 时,分别有 2,16,256 个表项;当为24位图时,没有颜色表项)
        位图数据(记录顺序是在扫描行内是从左到右, 扫描行之间是从下到上)(详细的BMP文档 见附件)
如何打开一张为BMP格式的图片呢?(24位图为例)

在这里我们会发现位运算的重要性,会发现int类型和字节之间的转换非常频繁,int 不仅可以表示数字,还可以表示颜色,还能拆分成字节

我们需要知道:一个int类型是32位,可以拆分成四个字节表示

                         24位图,一个像素占三个字节

                         在windows系统中的输出顺序是倒序,与java中输出顺序相反
                         windows中int的保存方式是:低位在前 ,高位在后
                        Java 中int的保存方式是:高位在前 低位在后
那我们就简单的来读取一下bmp图片

打开一张bmp图片

先写几个需要用到的方法

//读出int类型数据的方法
 public int myReadInt(InputStream ips) throws Exception {
//先读到的是低位
  int a = ips.read() & 0xff;
  int b = ips.read() & 0xff;
  int c = ips.read() & 0xff;
  int d = ips.read() & 0xff;
//拼接成一个int
  int t = (d << 24) + (c << 16) + (b << 8) + a;
 return t;
 }
//读取颜色的方法
 public int myReadColor(InputStream ips) throws Exception {
//倒序接收
  int b = ips.read() & 0xff;
  int g = ips.read() & 0xff;
  int r = ips.read() & 0xff;
//组成一个颜色,
  int t = (r << 16) + (g << 8) + b;
  return t;
 }

 
为了简洁操作,只读出重要的数据

 

//得到一个输入流
FileInputStream fis = new FileInputStream(path2);
  // 跳过18个字节,直接读取位图的宽和高
  fis.skip
//调用读int类型数据的方法,返回一个int类型的数
  int width = myReadInt(fis);
  int height = myReadInt(fis);
  // 跳到位图数据
  fis.skip(28);
  //计算行末尾需要补0的个数
  int num = width * 3 % 4;
  if (num > 0) {
   num = 4 - num;
  } 
  // 定义一个数组,来存放颜色数据,这里是用已经定义好了的数组
  DrawListener.arr = new int[height][width];
  // 循环取出数据,存放到数组
  for (int i = height - 1; i >= 0; i--) {
   for (int j = 0; j < width; j++) {
//调用将字节变成int类型的颜色的方法
    DrawListener.arr[i][j] = myReadColor(fis);
   }
   // 一行完了,跳过补得num个0;
   fis.skip(num);
  }
  // 重新设置屏幕大小
  panel.setPreferredSize(new Dimension(width, height));
  // 刷新面板
  SwingUtilities.updateComponentTreeUI(panel);

 

保存BMP图片(详细看附件)

     我们需要一个文件输出流用来将图片信息输出(字节的形式输出)
     按 照bmp输出的要求,将规定的数据输出,有几个点需要注意
    在输出信息头时时,注意我们需要输出图片的大小,在这里是将图片上的所有点的颜色当作一个二维数组,方便操作

 int height = DrawListener.arr.length;
 int width = DrawListener.arr[0].length;

 
由于,Windows规定一个扫描行所占的字节数必须是4 的倍数 ( 即以 long 为单位 ), 不足的以 0 填充,
在计算文件大小时,需要计算补0的个数(4 - width * 3 % 4)
24位位图文件大小=文件头+信息头+位图数据+补0=14+40+宽*3*高+(4-+宽*3%4)*高

int size = 14 + 40 + (width * 3 * height) + (4 - width * 3 % 4)* height;

在输出位图信息时,需要注意

//int类型的输出方法
public void myWriteInt(OutputStream ops, int t) throws Exception {
	// 将int类型转为四个字节
	int a = (t >> 24) & 0xff;
	int b = (t >> 16) & 0xff;
	int c = (t >> 8) & 0xff;
	int d = t & 0xff;
	// windows系统中是倒序传输的
	ops.write(d);ops.write(c);
	ops.write(b);ops.write(a);
}
//输出颜色的方法
public void myWriteColor(OutputStream ops, int t) throws Exception {
		int r = (t >> 16) & 0xFF;
		int g = (t >> 8) & 0xFF;
		int b = t & 0xFF;

		ops.write(b);
		ops.write(g);
		ops.write(r);
}

 

在输出位图数据文件时,需要注意行是否需要补0

//用两个for循环,遍历数组,得到每个点的颜色,  从下到上,从左到右
	for(int i=height-1;i>=0;i--){
		for(int j=0;j<width;j++){
		//调用将颜色输出的方法
		myWriteColor(ops, DrawListener.arr[i][j]);
	}
	//一行完了,在后面补0
	for(int k=0;k<num;k++){
		//补的是字节0
		ops.write(0);
	}
}

 

0
1
分享到:
评论

相关推荐

    DIP.rar_matlab dip_matlab工具尺寸_matlab幂次变换_保存为bmp_灰度图编码

    &#8226 重载可以重新载入最近一次通过“文件——〉打开”打开的图像,这时将对重新载入的图像进行处理; &#8226 对于彩色图像,可以显示但如果想要使程序能正确处理,必须将其先转换成灰度图像,使用“文件——〉RGB...

    RATA——工具绿色版.7z

    使用方法如下 1、先点击左侧的slect bmp file导入logo文件;... 4、点击make out.plt 生成的logo文件,该文件会保存在bmp图片所在文件夹。 5、打开allegro的brd文件,选择file/import/ipf,导入.plt文件

    数字图像处理——MFC实现DICOM图像打开与处理

    在MFC下用C++实现DICOM图像的打开,调整窗位、窗宽,DICOM图像.bmp格式保存的功能。该资源包含工程文件,注释较详细,各项功能均通过测试。

    ImageJ 1.42——ij142-jdk6-setup.exe

    ImageJ能够显示,编辑,分析,处理,保存,打印8位,16位,32位的图片, 支持TIFF, PNG, GIF, JPEG, BMP, DICOM, FITS等多种格式。ImageJ支持图像栈功能,即在一个窗口里以多线程的形式层叠多个图像, 并行处理。...

    计算机基础关键字汇总——计算机资料文档.docx

    PrintScreen 复制窗口、对话框 Alt+PrintScreen 打开剪贴板 Clipbrd 桌面排列 居中、平铺、拉伸 底部长条 任务栏 任务栏左端 开始按钮 任务栏特点 默认锁定、位置可以移动、大小可以改变 我最近的文档 15个 保存默认...

    图像模式识别——vc++技术实现(清华大学出版社)

    在右视图空白处,单击鼠标左键,激活右视图,单击工具条中的【保存为样品】按钮,或者选择菜单中的【文件】→【保存为样品】选项,可以把手写数字或者打开的数字图像保存至样品库中。 3) 看样品库 选择菜单中的...

    节点笔记_Ve.3.5.3内部测试版

    2、主界面菜单栏【功能】——【打开联想节点文件目录】可打开联想文件的存放目录。 ——Ve.3.4.1 更新说明—— 1、修复了圆周动作的一系列BUG。 2、新增有损替换功能。Ctrl+H可打开替换界面。可批量替换节点名、...

    图像处理:轻松调整多个图像的大小并保存给定目录-matlab开发

    - 完成后自动打开保存的图片文件夹 例子: imageResize(选项) 选项:4个选项可用1.folderName=将图片保存在“dir\folderName” 2. fileName= 指定文件名。 喜欢——“形象” 3. imSize= 指定图像大小。 喜欢-- ...

    Honeyview 漫画阅读器 v5.30.zip

    或者依次打开我的电脑-&gt;卸载或更改程序-&gt;卸载你所卸载的软件,您可以用 Window XP控制面板中的添加或删除程序功能,或用 Windows Vista、Windows 7中的程序和功能卸载时,您可以选择"删除在本机保存的个人配置数据...

    万能游戏资源提取软件

    你可以导入bmp或者png(支持透明色和alpha通道)格式的图片(注:“导入”操作只是引入了一个替换的标记,此时并未进行实际的替换) 如果想取消对当前图片的替换可以使用“导入”菜单中的“还原” 全部图像都替换完...

    优秀 PDF 阅读编辑器 PDF-XChanger Viewer Pro 2.5.322.10 + x64.zip

    -保存/恢复最后一次打开的文件(最后一次会话) -新的JPEG2000压缩支持——速度提高 -包括微软IE和火狐浏览器插件的 -无缝整合你最喜爱的翻译软件来“边看边译”——支持ABBYY Lingvo 12,Translate It!和Lingoes...

    FSCapture屏幕截图软件

    FastStone 捕获可保存为 BMP、GIF、JPEG、PCX、PNG、TGA、TIFF 和 PDF 格式的文件。 FSCapture 是一款抓屏工具,附带的其他两个小功能:取色器和屏幕放大镜。对抓取的图像提供缩放、旋转、减切、颜色调整等功能。...

    FireAlpaca v2.1.20.zip

    5.支持保存图片格式(mdp、png、jpg、bmp、psd) FireAlpaca的安装   把下载好的安装包解压到当前文件夹,之后双击【FireAlpaca_setup.exe】运行文件进行安装,打开的时候会出现安装框,依次开始安装,依照步骤...

    Total Commander 文件管理工具

    除此之外它还支持各种多媒体文件,例如BMP格式的图片、AVI、WAV,甚至MP3!如果功能再强大些恐怕Media Player、AcdSee、WinAmp都要下岗了。  搜索功能  和 Total Commander 搜索功能比起来,资源管理器中的简直...

    photoshop超级磨皮外挂滤镜

    以保存为 TIF、JPEG 或者 BMP 格式。 关于插件的使用请阅读文件“如何安装插件.txt” 如何安装插件 手动安装 Neat Image 插件到: - Adobe photoshop (以 photoshop 7.01 中文版为例) 方法 1 (传统方法): 将 Neat...

    系统增强文件管理器 Total Commander 9.51 + x64 Final 中文.zip

    除此之外它还支持各种多媒体文件,例如BMP格式的图片、AVI、WAV,甚至MP3!如果功能再强大些恐怕Media Player、AcdSee、WinAmp都要下岗了。 搜索功能 和 Total Commander 搜索功能比起来,资源管理器中的简直是...

    计算机应用技术(实用手册)

    解决方法:打开机箱,把主板上的一节纽扣电池取出,换上一节新的既可,或是CMOS被放电了,从新进入CMOS设置时间保存并退出就可解决此问题。 Press F1 tocontinue ,DEL to enter SETUP 按F1可以继续启动,按DEL进入...

    C++MFC教程

    MFC借助C++的优势为Windows开发开辟了一片新天地,同时也借助ApplicationWizzard使开发者摆脱离了那些每次都必写基本代码,借助ClassWizard和消息映射使开发者摆脱了定义消息处理时那种混乱和冗长的代码段。...

    新版Android开发教程.rar

    支持墙纸格式: JPG 、 BMP 、 PNG 和 GIF ;铃声 (MP3 、 AAC 、 AAC+ 和 WMA) 。 接入技术 蓝牙 (class 1) ;四频 (850 , 900 , 1800 , 1900) ;支持 3G , 802.11b 和 802.11g 。----------------------------...

Global site tag (gtag.js) - Google Analytics