为什么 BufferedImage 不能正常工作?!!是因为我用错了吗?
Why BufferedImage is not working well?!! Is it because I misused it?
我想使用 BufferedImage
将灰色图像从 getRGB()
复制到 int[][]
,然后复制到 setRGB()
。问题是图像的大小与程序输出的图像大小不同。原始图像的文件大小 = 176 KB,而输出图像的文件大小 = 154 KB。我不得不说,当你看到这两个图像时,所有人类都会说它是相同的,但就二进制位而言,我想知道的是不同的东西。
可能有人会说没关系,只要看的时候是一样的就好。其实在一些噪音项目的处理过程中,这是一个很大的问题,我怀疑这就是我出现问题的原因。
我只是想知道除了 BufferedImage
是否还有其他方法来生成 int[][]
然后创建输出?
这是我正在使用的代码:
public int[][] Read_Image(BufferedImage image)
{
width = image.getWidth();
height = image.getHeight();
int[][] result = new int[height][width];
for (int row = 0; row < height; row++)
for (int col = 0; col < width; col++)
result[row][col] = image.getRGB(row, col);
return result;
}
public BufferedImage Create_Gray_Image(int [][] pixels)
{
BufferedImage Ima = new BufferedImage(512,512, BufferedImage.TYPE_BYTE_GRAY);
for (int x = 0; x < 512; x++)
{
for (int y = 0; y < 512; y++)
{
int rgb = pixels[x][y];
int r = (rgb >> 16) & 0xFF;
int g = (rgb >> 8) & 0xFF;
int b = (rgb & 0xFF);
int grayLevel = (r + g + b) / 3;
int gray = (grayLevel << 16) + (grayLevel << 8) + grayLevel;
Ima.setRGB(x, y, pixels[x][y]);
}
}
return Ima;
}
public void Write_Image(int [][] pixels) throws IOException
{
File outputfile;
outputfile = new File("Y0111.png");
BufferedImage BI = this.Create_Gray_Image(pixels);
ImageIO.write(BI, "png", outputfile);
System.out.println("We finished writing the file");
}
见图,您看到文件大小 = 176 KB(这是原始图像)和文件大小 = 154 KB(这是输出图像)。
尺寸的差异不是问题。肯定是因为compression/encoding.
不同
BufferedImage 实际上是一个宽度 * 高度 * 通道大小的一维数组。 getRGB 不是 easiest/fastest 操作 BufferedImage 的方法。您可以使用 Raster(比 getRGB 快,不是最快的,但它会为您处理编码)。对于灰度图像:
int[][] my array = new int[myimage.getHeight()][myimage.getWidth()] ;
for (int y=0 ; y < myimage.getHeight() ; y++)
for (int x=0 ; x < myimage.getWidth() ; x++)
myarray[y][x] = myimage.getRaster().getSample(x, y, 0) ;
相反的方式:
for (int y=0 ; y < myimage.getHeight() ; y++)
for (int x=0 ; x < myimage.getWidth() ; x++)
myimage.getRaster().setSample(x, y, 0, myarray[y][x]) ;
最快的方法是使用 DataBuffer,但是您必须处理图像编码。
我想使用 BufferedImage
将灰色图像从 getRGB()
复制到 int[][]
,然后复制到 setRGB()
。问题是图像的大小与程序输出的图像大小不同。原始图像的文件大小 = 176 KB,而输出图像的文件大小 = 154 KB。我不得不说,当你看到这两个图像时,所有人类都会说它是相同的,但就二进制位而言,我想知道的是不同的东西。
可能有人会说没关系,只要看的时候是一样的就好。其实在一些噪音项目的处理过程中,这是一个很大的问题,我怀疑这就是我出现问题的原因。
我只是想知道除了 BufferedImage
是否还有其他方法来生成 int[][]
然后创建输出?
这是我正在使用的代码:
public int[][] Read_Image(BufferedImage image)
{
width = image.getWidth();
height = image.getHeight();
int[][] result = new int[height][width];
for (int row = 0; row < height; row++)
for (int col = 0; col < width; col++)
result[row][col] = image.getRGB(row, col);
return result;
}
public BufferedImage Create_Gray_Image(int [][] pixels)
{
BufferedImage Ima = new BufferedImage(512,512, BufferedImage.TYPE_BYTE_GRAY);
for (int x = 0; x < 512; x++)
{
for (int y = 0; y < 512; y++)
{
int rgb = pixels[x][y];
int r = (rgb >> 16) & 0xFF;
int g = (rgb >> 8) & 0xFF;
int b = (rgb & 0xFF);
int grayLevel = (r + g + b) / 3;
int gray = (grayLevel << 16) + (grayLevel << 8) + grayLevel;
Ima.setRGB(x, y, pixels[x][y]);
}
}
return Ima;
}
public void Write_Image(int [][] pixels) throws IOException
{
File outputfile;
outputfile = new File("Y0111.png");
BufferedImage BI = this.Create_Gray_Image(pixels);
ImageIO.write(BI, "png", outputfile);
System.out.println("We finished writing the file");
}
见图,您看到文件大小 = 176 KB(这是原始图像)和文件大小 = 154 KB(这是输出图像)。
尺寸的差异不是问题。肯定是因为compression/encoding.
不同BufferedImage 实际上是一个宽度 * 高度 * 通道大小的一维数组。 getRGB 不是 easiest/fastest 操作 BufferedImage 的方法。您可以使用 Raster(比 getRGB 快,不是最快的,但它会为您处理编码)。对于灰度图像:
int[][] my array = new int[myimage.getHeight()][myimage.getWidth()] ;
for (int y=0 ; y < myimage.getHeight() ; y++)
for (int x=0 ; x < myimage.getWidth() ; x++)
myarray[y][x] = myimage.getRaster().getSample(x, y, 0) ;
相反的方式:
for (int y=0 ; y < myimage.getHeight() ; y++)
for (int x=0 ; x < myimage.getWidth() ; x++)
myimage.getRaster().setSample(x, y, 0, myarray[y][x]) ;
最快的方法是使用 DataBuffer,但是您必须处理图像编码。