-2

我正在用 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();
        }
    }
}
4

2 回答 2

1

尝试移动值以写入更高的值

public void WriteDWORD(int i)
{
    writer.write((byte)(i >> 24));
    writer.write((byte)(i >> 16));
    writer.write((byte)(i >> 8));
    writer.write((byte)i);
}

也可能是小端(向后)查看这个关于字节序的维基百科http://en.wikipedia.org/wiki/Endianness

public void WriteDWORDLittleEndian(int i)
{
    writer.write((byte)i);
    writer.write((byte)(i >> 8));
    writer.write((byte)(i >> 16));
    writer.write((byte)(i >> 24));
}

还要检查你的作家是否有类似 .writeLong.writeInt或这样的命令.writeInteger 所以你不必自己做一个。

要获得这些命令,您必须执行http://docs.oracle.com/javase/7/docs/api/java/io/DataOutputStream.html

import java.io.DataOutputStream;
DataOutputStream dos = new DataOutputStream(writer);
dos.writeInt(1234567);
dos.close();
于 2015-01-12T22:59:36.400 回答
0
于 2015-01-13T01:52:42.803 回答