【问题标题】:how to convert a 8 bit gray scale bitmap to 4 bit scale in java?如何在java中将8位灰度位图转换为4位比例?
【发布时间】:2012-10-01 19:41:40
【问题描述】:

我想读取一个灰度图像文件,例如lena.bmp,然后在java中降低灰度分辨率,我用PixelGrabber得到这个图像的像素数据,如何转换这个8位灰度将位图缩放到 4 位? 谢谢!

【问题讨论】:

  • 你可以看看zerocool.is-a-geek.net/?p=329,它可能会给你一些想法
  • @MadProgrammer 它只是展示了如何将 RGB 转换为灰度,但如何将 8 位 bitmp 转换为 4 位?
  • 不确定,只是觉得它可能会提供一些想法,没关系

标签: java bitmap


【解决方案1】:

不确定他们是否可以在这里为您提供帮助,但也许您可以看看 JAI (Java Advanced Imaging)Apache Commons SanselanImage4j

编辑:

刚刚测试了 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 Documentation

【讨论】:

  • 这对我有用。谢谢:)
【解决方案2】:

这确实将位数减少到 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,其中包含您想要的 24 个灰度级。您可以简单地将索引乘以 17 以获得均匀分布的强度,从 0x0 * 17 = 0x000xf * 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]));
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-30
    • 2021-12-16
    • 2013-01-06
    • 2013-10-07
    • 1970-01-01
    • 2020-05-07
    • 2017-01-17
    相关资源
    最近更新 更多