如何在java中将8位灰度位图转换为4位灰度?
我想读取一个灰度图像文件,例如lena.bmp,然后在java中降低灰度分辨率,我使用如何在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
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位?不确定,只是认为它可能会提供一些想法,没关系