我正在用 Java 创建简单的 BMP 图像。不幸的是,当宽度或高度的大小超过十进制的 255 值(十六进制的 FF 值)时,我不知道如何将宽度和高度大小信息存储到 DIB 标头中。要创建小尺寸图像(255x255),我只需输入
对于宽度:FF 00 00 00,
对于高度:FF 00 00 00。
我可以在一个地方输入的最大值是十六进制的 FF(十进制的 255)。如何在这四个位置00 00 00 00中输入大于 255(十六进制为 FF)的值,以创建任何大尺寸图像,例如 513x513 像素?不知何故,我不得不使用其他零,但我在任何地方都找不到任何体面的解释。我应该如何在 Java 代码中实现这个原则?如果有任何帮助,我将不胜感激。
这是我的 Java 代码的一部分,用于将大小值输入到 DIB 标头以创建不大于 255x255 的图像。
writer = new FileOutputStream(new File(onName));
// width
writer.write(255);
writer.write(0);
writer.write(0);
writer.write(0);
// height
writer.write(255);
writer.write(0);
writer.write(0);
writer.write(0);
这是我的完整 Java 代码:
package fractalTerrain.midpointDisplacement;
import java.io.*;
import java.util.Random;
// User: Fataho
// Date: 2015-01-10
public class MonochromeMidpointDisplacement {
private static final String onName = "src\\fractalTerrain\\midpointDisplacement\\test2.bmp";
private Random random = new Random();
private static final int H_GRID = 256;
private static final int V_GRID = 256;
public static void main(String[] args) {
MonochromeMidpointDisplacement midpointDisplacement = new MonochromeMidpointDisplacement();
midpointDisplacement.go();
}
private void go(){
// fillMap(map, min, max);
printMap();
}
public void printMap(){
// 3.0 output to file
// 3.1 Begin the file
// 3.1.1 open output file
FileOutputStream writer = null;
try {
writer = new FileOutputStream(new File(onName));
// 3.1.2 copy the header
// 3.1.2.1 magic number
writer.write(66);
writer.write(77);
// 3.1.2.2 file size/unused space
for (int i = 0; i < 8; i++){
writer.write(0);
}
// 3.1.2.3 data offset
writer.write(54);
// 3.1.2.4 unused space
for (int i = 0; i < 3; i++){
writer.write(0);
}
// 3.1.2.5 header size
writer.write(40);
// 3.1.2.6 unused space
for (int i = 0; i < 3; i++){
writer.write(0);
}
// 3.1.2.7 file width (trickier)
writer.write(255);
writer.write(0);
writer.write(0);
writer.write(0);
// 3.1.2.8 file height (trickier)
writer.write(255);
writer.write(0);
writer.write(0);
writer.write(0);
// 3.1.2.9 color planes
writer.write(1);
writer.write(0);
// 3.1.2.10 bit depth
writer.write(24);
// 3.1.2.11 the rest
for (int i = 0; i < 25; i++){
writer.write(0);
}
for(int g = 0; g < ((V_GRID) * (H_GRID )); g++){
writer.write(255);
writer.write(0);
writer.write(0);
}
for (int k = 0; k < (H_GRID % 4); k++){
writer.write(0);
}
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}