0

.bmp 画像から画像バイト/ピクセル/データを読み取り、それをバイト/文字/int/etc 配列に格納するアプリケーションを作成しています。

ここで、この配列から、配列の 10 番目のインデックスに格納されているデータから 10 (10 進数) を減算します。

作成した配列に画像情報を正常に格納できました。しかし、アレイ情報を .bmp イメージに書き戻そうとすると、作成されたイメージが表示されません。

これは私がそうしようとしたコードです。

このコードでは、配列の 10 番目のインデックスから 10 を引いていません

public class Test1 {

    public static void main(String[] args) throws IOException{
        File inputFile = new File("d://test.bmp");
        FileReader inputStream = new FileReader("d://test.bmp");
        FileOutputStream outputStream = new FileOutputStream("d://test1.bmp");
        /*
         * Create byte array large enough to hold the content of the file.
         * Use File.length to determine size of the file in bytes.
         */
        char fileContent[] = new char[(int)inputFile.length()];


        for(int i = 0; i < (int)inputFile.length(); i++){
            fileContent[i] = (char) inputStream.read();
        }

        for(int i = 0; i < (int)inputFile.length(); i++){
            outputStream.write(fileContent[i]);
        }
    }
}
4

3 に答える 3

0

char[] の代わりに、byte[] を使用します

コードが機能する場合の修正版は次のとおりです。

public class Test {

public static void main(String[] args) throws IOException {
    File inputFile = new File("someinputfile.bmp");
    FileOutputStream outputStream = new FileOutputStream("outputfile.bmp");
    /*
     * Create byte array large enough to hold the content of the file.
     * Use File.length to determine size of the file in bytes.
     */
    byte fileContent[] = new byte[(int)inputFile.length()];


    new FileInputStream(inputFile).read(fileContent);

    for(int i = 0; i < (int)inputFile.length(); i++){
        outputStream.write(fileContent[i]);
    }

    outputStream.close();
 }
}
于 2013-02-05T09:47:47.257 に答える
0

他の人はコードのエラーを指摘しましたが (ほとんどcharの代わりに使用byte)、ただし、それを修正したとしても、ファイルの 10 番目のバイトの値を変更すると、おそらく読み込めない画像になるでしょう。

これは、画像ファイルが、実際の画像データの前に、ファイルに関する情報 (色深度、寸法など).bmp含むヘッダーで始まるためです。具体的には、10 番目のバイトは、実際の画像データ (ピクセル配列) のオフセットを格納する 4 バイト整数の一部です。したがって、この値から 10 を引くと、オフセットがファイル内の間違ったポイントを指している可能性があり、境界チェックを行うイメージ ローダーはおそらくこれを無効と見なします。

本当にやりたいことは、画像を画像として読み込み、ピクセル値を直接操作することです。そんな感じ:

BufferedImage originalImage = ImageIO.read(new File("d://test.bmp"));
int rgb = originalImage.getRGB(10, 0);
originalImage.setRGB(rgb >= 10 ? rgb - 10 : 0);
ImageIO.write(originalImage, "bmp", new File("d://test1.bmp"));
于 2013-02-05T10:33:16.917 に答える
0

既存のコードを機能させるには、FileReader を FileInputStream に置き換える必要があります。FileReader javadoc によると:

FileReader は、文字のストリームを読み取るためのものです。生バイトのストリームを読み取るには、FileInputStream の使用を検討してください。

以下のようにサンプルを変更します

  public static void main(String[] args) throws IOException
 {
File inputFile = new File("d://test.bmp");
FileInputStream inputStream = new FileInputStream("d://test.bmp");
FileOutputStream outputStream = new FileOutputStream("d://test1.bmp");
/*
 * Create byte array large enough to hold the content of the file.
 * Use File.length to determine size of the file in bytes.
 */
byte fileContent[] = new byte[(int)inputFile.length()];

for(int i = 0; i < (int)inputFile.length(); i++){
    fileContent[i] =  (byte) inputStream.read();
}

inputStream.close();
for(int i = 0; i < (int)inputFile.length(); i++){
    outputStream.write(fileContent[i]);
}

outputStream.flush();
outputStream.close();

}

これは、元の画像のコピーを作成するのに役立ちます。

上記のコメントで述べたように、これはおそらくあなたが達成しようとしていることに対する正しいアプローチではありません。

于 2013-02-05T10:23:03.417 に答える