1

lena.bmp などのグレー レベルの画像ファイルを読み込んで、Java でグレー レベルの解像度を下げたいのですが、以前PixelGrabberはこの画像のピクセル データを取得していましたが、この 8 ビットのグレー スケール ビットマップを 4 ビットに変換する方法を教えてください。ありがとう!

4

2 に答える 2

3

ここで役立つかどうかはわかりませんが、JAI (Java Advanced Imaging)Apache Commons Sanselan、またはImage4jを参照してください。

編集:

Image4J ライブラリをテストしました:

8 ビット -> 4 ビットの変換は非常に簡単です。

final File inFile = new File("test.bmp");
final File outFile = new File("test2.bmp");

BufferedImage inImage = ImageIO.read(inFile);
BufferedImage outImage = ConvertUtil.convert4(inImage); // Converts to 4 Bit

ImageIO.write(outImage, "bmp", outFile);

詳細については、 Image4J - ConvertUtil のドキュメントを参照してください。

于 2012-10-01T11:29:02.527 に答える
1

これにより、ビット数が 4 に減少します。

public static void main(String[] args) throws Exception {
    BufferedImage in = ImageIO.read(new File(args[0]));
    int w = in.getWidth(), h = in.getHeight();
    int[] bits = { 4 };
    ColorSpace cs = ColorSpace.getInstance(ColorSpace.CS_GRAY);
    int dt = DataBuffer.TYPE_BYTE;
    ColorModel cm = new ComponentColorModel
        (cs, bits, false, false, Transparency.OPAQUE, dt);
    WritableRaster wr = cm.createCompatibleWritableRaster(w, h);
    BufferedImage out = new BufferedImage(cm, wr, false, null);
    Graphics2D g = out.createGraphics();
    g.drawImage(in, 0, 0, null);
    g.dispose();
    ImageIO.write(out, "png", new File(args[1]));
}

結果として得られるファイルは、これまでに試したすべてのビューア アプリケーションで暗すぎるように見えます。ただし、ビットのみに関心がある場合はwr、上記の変換後にラスターを操作するだけで十分です。

IndexedColorModelそうでない場合は、必要な2 4グレー レベルを含む を設定する必要があります。0x0 * 17 = 0x00インデックスに 17 を掛けるだけで、 からまでの等間隔の強度を得ることができます0xf * 17 = 0xff

public static void main(String[] args) throws Exception {
    BufferedImage in = ImageIO.read(new File(args[0]));
    int w = in.getWidth(), h = in.getHeight();
    byte[] v = new byte[1 << 4];
    for (int i = 0; i < v.length; ++i)
        v[i] = (byte)(i*17);
    ColorModel cm = new IndexColorModel(4, v.length, v, v, v);
    WritableRaster wr = cm.createCompatibleWritableRaster(w, h);
    BufferedImage out = new BufferedImage(cm, wr, false, null);
    Graphics2D g = out.createGraphics();
    g.drawImage(in, 0, 0, null);
    g.dispose();
    ImageIO.write(out, "png", new File(args[1]));
}
于 2012-10-01T11:33:37.933 に答える