iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >怎么用Java保存位图文件
  • 473
分享到

怎么用Java保存位图文件

2023-06-03 03:06:49 473人浏览 独家记忆
摘要

这篇文章主要介绍“怎么用Java保存位图文件”,在日常操作中,相信很多人在怎么用Java保存位图文件问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么用Java保存位图文件”的疑惑有所帮助!接下来,请跟着小编

这篇文章主要介绍“怎么用Java保存位图文件”,在日常操作中,相信很多人在怎么用Java保存位图文件问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么用Java保存位图文件”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

  位图文件的格式

  位图文件格式支持 4 位 RLE(行程长度编码)以及 8 位和 24 位编码。因为我们只处理 24 位格式,所以下面我们查看一下该文件的结构。

  位图文件分为三个部分。我已将它们列在下面。

  第 1 部分:位图文件的标头

  标头包含位图文件的类型大小信息和版面信息。结构如下(摘自 C 语言结构定义):

 
typedef struct tagBITMAPFILEHEADER {
   UINT bfType;
   DWord bfSize;
   UINT bfReserved1;
   UINT bfReserved2;
   DWORD bfOffBits;
  }BITMAPFILEHEADER;

 下面是对这个清单中的代码元素的说明:

  bfType:指定文件类型,其值始终为 BM。

  bfSize:指定整个文件的大小(以字节为单位)。

  bfReserved1:保留 -- 必须为 0。

  bfReserved2:保留 -- 必须为 0。

  bfOffBits:指定从 BitmapFileHeader 到图像首部的字节偏移量。

  现在您已经明白位图标头的用途就是标识位图文件。读取位图文件的每个程序都使用位图标头来进行文件验证。

  第 2 部分:位图信息标头

  随后的标头称为信息标头,其中包含图像本身的属性。

  下面说明如何指定 windows 3.0(或更高版本)设备独立位图 (DIB) 的大小和颜色格式:

  typedef struct tagBITMapiNFOHEADER {
    DWORD biSize;
    LONG biWidth;
    LONG biHeight;
    WORD biPlanes;
    WORD biBitCount;
    DWORD biCompression;
    DWORD biSizeImage;
    LONG biXPelsPerMeter;
    LONG biYPelsPerMeter;
    DWORD biClrUsed;
    DWORD biClrImportant;
  } BITMAPINFOHEADER;

  
  以上代码清单的每个元素说明如下:


   biSize:指定 BITMAPINFOHEADER 结构所需的字节数。

   biWidth:指定位图的宽度(以象素为单位)。

   biHeight:指定位图的高度(以象素为单位)。

   biPlanes:指定目标设备的位面数。这个成员变量的值必须为 1。

   biBitCount:指定每个象素的位数。其值必须为 1、4、8 或 24。

   biCompression:指定压缩位图的压缩类型。在 24 位格式中,该变量被设置为 0。

   biSizeImage:指定图像的大小(以字节为单位)。如果位图的格式是 BI_RGB,则将此成员变量设置为 0 是有效的。

   biXPelsPerMeter:为位图指定目标设备的水平分辨率(以“象素/米”为单位)。应用程序可用该值从最符合当前设备特征的资源群组中选择一个位图。

   biYPelsPerMeter:为位图指定目标设备的垂直分辨率(以“象素/米”为单位)。

   biClrUsed:指定位图实际所用的颜色表中的颜色索引数。如果 biBitCount 设为 24,则 biClrUsed 指定用来优化 Windows 调色板性能的参考颜色表。

   biClrImportant:指定对位图的显示有重要影响的颜色索引数。如果此值为 0,则所有颜色都很重要。

  现在已定义了创建图像所需的全部信息。

  第 3 部分:图像

  在 24 位格式中,图像中的每个象素都由存储为 BRG 的三字节 RGB 序列表示。每个扫描行都被补足到 4 位。为了使这个过程稍复杂一点,图像是自底而上存储的,即第一个扫描行是图像中的最后一个扫描行。下图显示了标头 (BITMAPHEADER) 和 (BITMAPINFOHEADER) 以及部分图像。各个部分由垂线分隔:

0000000000 4D42 B536 0002 0000 0000 0036 0000 | 0028
0000000020 0000 0107 0000 00E0 0000 0001 0018 0000
0000000040 0000 B500 0002 0EC4 0000 0EC4 0000 0000
0000000060 0000 0000 0000 | FFFF FFFF FFFF FFFF FFFF
0000000100 FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF
*

  现在,我们开始检视代码

  现在我们已经知道了 24 位位图文件的结构,下面就是您期待已久的内容:用来将图像对象写入位图文件的代码。
import java.awt.*;
import java.io.*;
import java.awt.image.*;

public class BMPFile extends Component {

file://--- 私有常量
private final static int BITMAPFILEHEADER_SIZE = 14;
private final static int BITMAPINFOHEADER_SIZE = 40;

file://--- 私有变量声明

file://--- 位图文件标头
private byte bitmapFileHeader [] = new byte [14];
private byte bfType [] = {'B', 'M'};
private int bfSize = 0;
private int bfReserved1 = 0;
private int bfReserved2 = 0;
private int bfOffBits = BITMAPFILEHEADER_SIZE + BITMAPINFOHEADER_SIZE;

file://--- 位图信息标头
private byte bitmapInfoHeader [] = new byte [40];
private int biSize = BITMAPINFOHEADER_SIZE;
private int biWidth = 0;
private int biHeight = 0;
private int biPlanes = 1;
private int biBitCount = 24;
private int biCompression = 0;
private int biSizeImage = 0x030000;
private int biXPelsPerMeter = 0x0;
private int biYPelsPerMeter = 0x0;
private int biClrUsed = 0;
private int biClrImportant = 0;

file://--- 位图原始数据
private int bitmap [];

file://--- 文件部分
private FileOutputStream fo;

file://--- 缺省构造函数
public BMPFile() {

}


public void saveBitmap (String parFilename, Image parImage, int
parWidth, int parHeight) {

try {
fo = new FileOutputStream (parFilename);
save (parImage, parWidth, parHeight);
fo.close ();
}
catch (Exception saveEx) {
saveEx.printStackTrace ();
}

}



private void save (Image parImage, int parWidth, int parHeight) {

try {
convertImage (parImage, parWidth, parHeight);
writeBitmapFileHeader ();
writeBitmapInfoHeader ();
writeBitmap ();
}
catch (Exception saveEx) {
saveEx.printStackTrace ();
}
}



private boolean convertImage (Image parImage, int parWidth, int parHeight) {

int pad;
bitmap = new int [parWidth * parHeight];

PixelGrabber pg = new PixelGrabber (parImage, 0, 0, parWidth, parHeight,
bitmap, 0, parWidth);

try {
pg.grabpixels ();
}
catch (InterruptedException e) {
e.printStackTrace ();
return (false);
}

pad = (4 - ((parWidth * 3) % 4)) * parHeight;
biSizeImage = ((parWidth * parHeight) * 3) + pad;
bfSize = biSizeImage + BITMAPFILEHEADER_SIZE +
BITMAPINFOHEADER_SIZE;
biWidth = parWidth;
biHeight = parHeight;

return (true);
}


private void writeBitmap () {

int size;
int value;
int j;
int i;
int rowCount;
int rowIndex;
int lastRowIndex;
int pad;
int padCount;
byte rgb [] = new byte [3];


size = (biWidth * biHeight) - 1;
pad = 4 - ((biWidth * 3) % 4);
if (pad == 4) // <==== 错误修正
pad = 0; // <==== 错误修正
rowCount = 1;
padCount = 0;
rowIndex = size - biWidth;
lastRowIndex = rowIndex;

try {
for (j = 0; j < size; j++) {
value = bitmap [rowIndex];
rgb [0] = (byte) (value & 0xFF);
rgb [1] = (byte) ((value >> 8) & 0xFF);
rgb [2] = (byte) ((value >> 16) & 0xFF);
fo.write (rgb);
if (rowCount == biWidth) {
padCount += pad;
for (i = 1; i <= pad; i++) {
fo.write (0x00);
}
rowCount = 1;
rowIndex = lastRowIndex - biWidth;
lastRowIndex = rowIndex;
}
else
rowCount++;
rowIndex++;
}

file://--- 更新文件大小
bfSize += padCount - pad;
biSizeImage += padCount - pad;
}
catch (Exception wb) {
wb.printStackTrace ();
}

}


private void writeBitmapFileHeader () {

try {
fo.write (bfType);
fo.write (intToDWord (bfSize));
fo.write (intToWord (bfReserved1));
fo.write (intToWord (bfReserved2));
fo.write (intToDWord (bfOffBits));

}
catch (Exception wbfh) {
wbfh.printStackTrace ();
}

}

private void writeBitmapInfoHeader () {

try {
fo.write (intToDWord (biSize));
fo.write (intToDWord (biWidth));
fo.write (intToDWord (biHeight));
fo.write (intToWord (biPlanes));
fo.write (intToWord (biBitCount));
fo.write (intToDWord (biCompression));
fo.write (intToDWord (biSizeImage));
fo.write (intToDWord (biXPelsPerMeter));
fo.write (intToDWord (biYPelsPerMeter));
fo.write (intToDWord (biClrUsed));
fo.write (intToDWord (biClrImportant));
}
catch (Exception wbih) {
wbih.printStackTrace ();
}

}



private byte [] intToWord (int parValue) {

byte retValue [] = new byte [2];

retValue [0] = (byte) (parValue & 0x00FF);
retValue [1] = (byte) ((parValue >> 8) & 0x00FF);

return (retValue);

}


private byte [] intToDWord (int parValue) {

byte retValue [] = new byte [4];

retValue [0] = (byte) (parValue & 0x00FF);
retValue [1] = (byte) ((parValue >> 8) & 0x000000FF);
retValue [2] = (byte) ((parValue >> 16) & 0x000000FF);
retValue [3] = (byte) ((parValue >> 24) & 0x000000FF);

return (retValue);

}

}
 

  小结

  这就是所要做的全部工作。我确信您将会发现这个类很有用,因为到 jdk 1.1.6 为止,Java 不支持用任何常用的格式保存图像。JDK 1.2 将支持创建 JPEG 图像,但不支持创建位图。所以这个类仍将填补 JDK1.2 中的空白。

到此,关于“怎么用Java保存位图文件”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

--结束END--

本文标题: 怎么用Java保存位图文件

本文链接: https://www.lsjlt.com/news/232540.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 怎么用Java保存位图文件
    这篇文章主要介绍“怎么用Java保存位图文件”,在日常操作中,相信很多人在怎么用Java保存位图文件问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么用Java保存位图文件”的疑惑有所帮助!接下来,请跟着小编...
    99+
    2023-06-03
  • java文件流怎么保存成文件
    要将Java文件流保存为文件,可以使用FileOutputStream类。以下是保存Java文件流的示例代码:javaimport ...
    99+
    2023-10-21
    java
  • mac截图保存位置怎么修改
    这篇文章主要讲解了“mac截图保存位置怎么修改”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“mac截图保存位置怎么修改”吧! mac截图保存位置 1、已...
    99+
    2022-12-28
    mac
  • win10截图保存位置怎么查看
    这篇文章主要介绍“win10截图保存位置怎么查看”,在日常操作中,相信很多人在win10截图保存位置怎么查看问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”win10截图保存位置怎么查看”的疑惑有所帮助!接下来...
    99+
    2023-07-01
  • win10系统怎么修改文件默认保存位置
    本文小编为大家详细介绍“win10系统怎么修改文件默认保存位置”,内容详细,步骤清晰,细节处理妥当,希望这篇“win10系统怎么修改文件默认保存位置”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。修改方法:在win...
    99+
    2023-06-28
  • php怎么保存文件
    这篇文章主要介绍了php怎么保存文件,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。php保存文件的方法:首先创建一个PHP示例文件;然后生成文件;最后用代码“if(isset...
    99+
    2023-06-20
  • Android中怎么将Bitmap保存为PNG图像文件
    Android中怎么将Bitmap保存为PNG图像文件,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。具体代码如下所示:public static voi...
    99+
    2023-05-30
    android bitmap
  • windows中psd文件怎么保存为高清图片
    这篇“windows中psd文件怎么保存为高清图片”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看...
    99+
    2023-02-25
    windows
  • redis文件怎么保存的
    redis文件是把数据保存到内存中的,也会定期把数据写入硬盘中。它有两种关于储存的持久化机制:RDB和AOF。RDB指的是用数据集快照的方式半持久化模式记录 redis数据库的所有键值对,在某个时间点将数据写入一个临时文件,持久化结束后,用...
    99+
    2022-10-19
  • android怎么保存json文件
    Rate limit reached for gpt-3.5-turbo in organization org-68Lqb4iD2...
    99+
    2023-10-18
    android json
  • java怎么将输出内容保存到文件
    在Java中,可以使用FileWriter或BufferedWriter类将输出内容保存到文件中。下面是一个简单的示例代码,演示了如...
    99+
    2023-10-18
    java
  • java中怎么实现保存文件到本地
    知识补充:File类以抽象的方式代表文件名和目录路径名,该类主要用于文件和目录的创建、文件的查找和文件的删除等。FileOutputStream类用来创建一个文件并向文件中写数据,如果该流在打开文件进行输出前,目标文件不存在,那么该流会创建...
    99+
    2018-12-25
    java基础 java 实现 保存 本地
  • win11没有权限在此位置中保存文件怎么办
    win11没有权限在此位置中保存文件怎么办?win11用户在保存文件到C盘的时候遇到了没有权限在此位置中保存文件的提示,导致无法正常保存,怎么办呢?为了帮助大家解决这个问题,小编带来了win11没有权限在此位置中保存文件解决办法,好奇如何操...
    99+
    2023-07-10
  • Linux常用的配置文件保存位置大全
    这篇文章主要介绍“Linux常用的配置文件保存位置大全”,在日常操作中,相信很多人在Linux常用的配置文件保存位置大全问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Linux常用的配置文件保存位置大全”的疑...
    99+
    2023-06-13
  • java中怎么下载文件流保存到本地
    在Java中,可以使用`InputStream`和`OutputStream`来下载文件流并保存到本地。下面的代码演示了如何使用`U...
    99+
    2023-09-05
    java
  • python怎么保存list到文件
    要将列表保存到文件中,可以使用以下方法: 使用`pickle`模块将列表保存为二进制文件: import pickle my_...
    99+
    2023-10-24
    python
  • windows的hosts文件怎么保存
    今天小编给大家分享一下windows的hosts文件怎么保存的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。hosts文件保存...
    99+
    2023-07-01
  • 怎么用vbscript把Word文档保存为文本文件
    这篇文章主要介绍“怎么用vbscript把Word文档保存为文本文件”,在日常操作中,相信很多人在怎么用vbscript把Word文档保存为文本文件问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么用vbsc...
    99+
    2023-06-08
  • win10怎么更改缓存文件保存路径
    这篇文章主要介绍win10怎么更改缓存文件保存路径,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!win10如何更改缓存文件保存路径右击此电脑,点击属性。点击高级系统设置。点击环境变量。可以看到用户变量中有“TEMP”...
    99+
    2023-06-09
  • word怎么找回未保存的文件
    如果你使用的是Word程序,但是未保存的文件意外关闭了,你可以尝试以下方法找回未保存的文件:1. 重新打开Word:在重新打开Wor...
    99+
    2023-09-20
    word
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作