Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在java中将8位灰度位图转换为4位灰度?_Java_Bitmap - Fatal编程技术网

如何在java中将8位灰度位图转换为4位灰度?

如何在java中将8位灰度位图转换为4位灰度?,java,bitmap,Java,Bitmap,我想读取一个灰度图像文件,例如lena.bmp,然后在java中降低灰度分辨率,我使用PixelGrabber获取此图像的像素数据,如何将此8位灰度位图转换为4位? 谢谢 如果舒尔能为您提供帮助,请不要使用舒尔,但也许您可以看看,或者 编辑: 刚刚测试了Image4J库: 转换8位->4位非常简单: final File inFile = new File("test.bmp"); final File outFile = new File("test2.bmp"); BufferedImag

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

如果舒尔能为您提供帮助,请不要使用舒尔,但也许您可以看看,或者

编辑: 刚刚测试了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);

有关更多信息,请参阅。

这会将位数减少到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
光栅进行操作可能就足够了

如果没有,那么您可能应该设置一个包含所需24个灰度级的
IndexedColorModel
。您只需将索引乘以17即可获得均匀分布的强度,从
0x0*17=0x00
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]));
}
publicstaticvoidmain(字符串[]args)引发异常{
buffereImage in=ImageIO.read(新文件(args[0]);
int w=in.getWidth(),h=in.getHeight();

byte[]v=新字节[1你可以看一下,它可能会给你一些ideas@MadProgrammer它只是演示了如何将RGB转换为灰度,但如何将8位位图转换为4位?不确定,只是认为它可能会提供一些想法,没关系