-2

Javaで簡単なBMP画像を作成しています。残念ながら、幅または高さのサイズが 10 進数で 255 値 (16 進数で FF 値) を超える場合、幅と高さのサイズ情報を DIB ヘッダーに格納する方法がわかりません。小さなサイズの画像(255x255)を作成するには、入力するだけです

幅: FF 00 00 00

高さ: FF 00 00 00 .

1 か所に入力できる最大値は、16 進数で FF (10 進数で 255) です。513x513 ピクセルなどの大きなサイズの画像を作成するために、これら 4 つの場所00 00 00 00に 255 (16 進数で FF) より大きい値を入力するにはどうすればよいですか? どういうわけか、他のゼロを使用する必要がありますが、適切な説明はどこにも見つかりませんでした。Java コードでこの原則をどのように実装すればよいですか? どんな助けにもとても感謝しています。

これは、DIB ヘッダーにサイズ値を入力して 255x255 以下の画像を作成するために使用する Java コードの一部です。

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);
}

リトル エンディアン (後方) の場合もあります。エンディアンについては、この wikipedia をご覧ください。

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

また、ライターに .writeLongor.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 に答える