24ビットBMPイメージ(ImageIOまたは外部ライブラリなし)を読み込み、8ビットグレースケールのBMPイメージにするプログラムを作成する必要があります。イメージのヘッダーを8ビットにするには、Source 1とSource 2に変更する必要があります。だから、私はその後、私が手に私のファイルを読み込み、このBMPイメージを8ビットのグレースケールに変換する方法
FileInputStream image= new FileInputStream(path);
byte[] bytesImage = new byte[image.available()];
image.read(bytesImage);
image.close();
のようなバイトベクトルを生成まず
... BITCOUNTバイトが29とヘッダの30であり、それらを変更しようという hereを読みます画像ヘッダとその後、私は、ヘッダー情報がこのような8ビットBMP作るためにバイトを変更するには、新しいベクトルにint width = byteToInt(bytesImage[18], bytesImage[19], bytesImage[20], bytesImage[21]);
int height = byteToInt(bytesImage[22], bytesImage[23], bytesImage[24], bytesImage[25]);
int header = byteToInt(bytesImage[14], bytesImage[15], bytesImage[16], bytesImage[17]) + 14; // Add 14 for the header
vecGrey = Arrays.copyOf(bytesImage, bytesImage.length);
をコピーします
byte[] values = intToByte(8);
vecGrey[28] = values[0]; // This is the index for the BitCount byte 1
vecGrey[29] = values[1]; // and this one is the index for the second one.
オーケーは今、私はここにショーとしてdiferentヘッダでvecGreyを書くしようとした場合、私はvecGreyでヘッダを持つファイルを書き込むことはできませんいくつかの理由で、問題が来る:
FileOutputStream aGrey = new FileOutputStream(name+ "-gray.bmp");
aGrey.write(vecGrey);
aGrey.close();
// This is a method that displays the resulting image in a frame...
makeInterface(name + "-gray.bmp");
私は私がしなければならないことを知っていますvecGreyの値を変更しますが、これは不正な出力(おそらくグレースケールの画像ではないか、まったく画像ではない)を表示するように働くはずです。私はmakeInterface()メソッドで生成したファイルを読み込むしようとすると、しかし、私はだから私は、プログラムがあることをasume画像ヘッダ
を読み取ることができませんでし
javax.imageio.iioexceptionを取得しますヘッダーを正しく読み取れませんが、理由はわかりません。私がBitCountの値を16に変更しても、それは動作しますが、1,4、または8には同じエラーでは動作しません。私はホールコードをスペイン語でアップロードしませんでしたが、必要ならば翻訳できますそれを編集してください。
ありがとうございます!
EDIT1:私は640x480の24ビットBMPイメージのみを使用しているので、パディングをチェックする必要はありません。
BMPはそれほど単純ではありませんが、行の長さは4になりました(現在は1バイトになります)。フォーマット参照を使用して、ボックスのような独自の小さなグレースケール画像を作成してみてください。そして変換を行います。 –
@JoopEggen申し訳ありません!私は640x480のBMP 24ビットイメージしか使用していないことを忘れていたので、パディングについて心配する必要はありません。私はこれら2つのフォーマットの参考文献[ここ](http://www.daubnet.com/en/file-format-bmp)と[ここ](https://upload.wikimedia.org/wikipedia/commons/c)を使用しています。 /c4/BMPfileFormat.png)。 –
コーディングの楽しみを楽しませることを怠っていません。グレースケール画像を作成し、データを分析することを検討してください。あなたが注文ByteOrder.LITTLE_ENDIANを使ってByteBufferを使わなかったのは残念ですが、getShort、getInt、earier –