我正在使用java进行图像处理。 我读取灰度图像并将像素值转换为0和1我只为一些图像正确获得了输出图像。 在其他人中,一些图像部分丢失了 这是我用来使图像阵列回到图像的代码
`BufferedImage I = ImageIO.read(new File("path"));
SampleModel sampleModel;
Raster pixelData;
pixelData = I.getData();
int[][] pixels=new int[wid][hgt];
sampleModel=pixelData.getSampleModel();
BufferedImage image=new BufferedImage(wid,hgt,BufferedImage.TYPE_BYTE_BINARY);
WritableRaster raster=Raster.createWritableRaster(sampleModel,new Point(0,0));
for(int i=0;i<wid;i++)
{
for(int j=0;j<hgt;j++)
{
raster.setSample(i,j,0,pixels[i][j]);
}
}
image.setData(raster);
File output=new File("path");
ImageIO.write(image,"png",output);
System.out.println("..End..");`
图像的大小与原始大小相同,但整个大小只包含原始图像的一部分。大家帮帮我
答案 0 :(得分:1)
您的问题可能与您使用的样本模型有关。样本模型负责描述Raster如何存储数据,也许您正在使用一个模型,每个像素放置更多信息,然后图像只获得原始缓冲区的一部分。
干杯
[更新] @Joop Egen是正确的,您需要使用您定义的图像中的样本模型,即每个像素使用灰度字节“配置”
答案 1 :(得分:0)
我的问题得到了一个很好的答案,它适用于所有图像(包括24位和8位图像)
BufferedImage I = ImageIO.read(new File("path"));
Raster pixelData;
pixelData = I.getData();
int pixels[][]=new int[wid][hgt];
for ( x=0;x<wid;x++)
{
for( y=0;y<hgt;y++)
{
pixels[x][y]=pixelData.getSample(x,y,0);
}
}
BufferedImage image=new BufferedImage(wid,hgt,BufferedImage.TYPE_BYTE_BINARY);
ColorSpace cs = ColorSpace.getInstance(ColorSpace.CS_GRAY);
int[] nBits = { 8 };
ColorModel cm = new ComponentColorModel(cs, nBits, false, true,Transparency.OPAQUE, DataBuffer.TYPE_BYTE);
SampleModel sm = cm.createCompatibleSampleModel(wid, hgt);
WritableRaster raster=Raster.createWritableRaster(sm,new Point(0,0));
for(int i=0;i<wid;i++)
{
for(int j1=0;j1<hgt;j1++)
{
raster.setSample(i,j1,0,pixels[i][j1]);
}
}
image.setData(raster);
File output=new File("path");
ImageIO.write(image,"png",output);`