Я хочу скопировать серое изображение, используя BufferedImage
от getRGB()
до int[][]
, а затем до setRGB()
. Проблема в том, что размер изображения отличается от размера того, который выводит программа. Исходное изображение имеет размер файла = 176 КБ, тогда как выходное изображение имеет размер файла = 154 КБ. Я должен сказать, что когда вы видите два изображения, все человеческое существо скажет, что это одно и то же, но с точки зрения двоичных бит, в чем-то, что я хотел бы узнать, есть разные.Почему BufferedImage не работает? !! Это потому, что я неправильно ее использовал?
Возможно, некоторые из вас скажут, что это не имеет значения, если изображение будет таким же, если вы посмотрите на него. Фактически, во время обработки некоторого проекта шума это огромная проблема, и я подозреваю, что именно по этой причине у меня есть проблема.
Я просто хочу знать, есть ли другой метод, чем 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 КБ (это исходное изображение) и размер файла = 154 КБ (это выход образ).
Это, скорее всего, сведен к формату изображения и уровню сжатия, используемому при записи изображения. – MadProgrammer
@MadProgrammer Хорошая точка. Знаете ли вы, что какой-либо другой формат записи делает компрессию такой же, как и входной? – user777
Я бы начал с написания оригинального BufferedImage, чтобы узнать, не имеет значения. Другая разница может быть цветовой моделью, используемой исходным изображением – MadProgrammer