2016-01-08 4 views
1

Я хочу скопировать серое изображение, используя 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 КБ (это выход образ).

enter image description here

+1

Это, скорее всего, сведен к формату изображения и уровню сжатия, используемому при записи изображения. – MadProgrammer

+0

@MadProgrammer Хорошая точка. Знаете ли вы, что какой-либо другой формат записи делает компрессию такой же, как и входной? – user777

+0

Я бы начал с написания оригинального BufferedImage, чтобы узнать, не имеет значения. Другая разница может быть цветовой моделью, используемой исходным изображением – MadProgrammer

ответ

1

Разница в размерах не является проблемой. Это, конечно, из-за разного сжатия/кодирования.

BufferedImage на самом деле является 1D массивом ширины ширины * высоты * канала. getRGB не самый простой и быстрый способ манипулировать 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, но тогда вы должны обрабатывать кодирования изображения.

+0

Удивительно, да, это то, что я ищу, Спасибо, что так много. Я тестировал, и он работает, и размер выходов совпадает с размером ввода. – user777

+0

Рад, что это работает для вас. Но, как я уже сказал, разница в размерах, конечно, связана с другой проблемой.Если вы хотите ускорить преобразование, используйте DataBuffer, иначе растровое изображение будет прекрасным. – FiReTiTi

 Смежные вопросы

  • Нет связанных вопросов^_^