2014-01-09 2 views
2

Я получаю массив int из png изображения, как я буду преобразовывать это в bufferdimage или создавать новый PNG-файл?Создание файла PNG из массива int из RGB данных

int[] pixel = new int[w1*h1]; 
     int i = 0; 
     for (int xx = 0; xx < h1; xx++) { 
      for (int yy = 0; yy < w1; yy++) { 
         pixel[i] = img.getRGB(yy, xx); 
         i++; 
       } 
     } 
+0

Пожалуйста, прекратите публикацию того же вопроса. –

+0

Возможный дубликат [чтение пикселя из png] (http://stackoverflow.com/questions/21029158/reading-pixel-from-png) –

+1

не дублированный вопрос –

ответ

0

Попробуйте ImageIO класс, который может принять массив байтов, представляющий данные пикселя, чтобы построить изображение объекта, а затем записывая его в определенном формате.

try { 
    BufferedImage bufferedImage = ImageIO.read(new ByteArrayInputStream(yourBytes)); 
    ImageIO.write(bufferedImage, "png", new File("out.png")); 
} catch (IOException e) { 
    e.printStackTrace(); 
} 
+0

У меня есть массив int not byte –

+0

Исключение в теме "main" java.lang.IllegalArgumentException: image == null! \t в javax.imageio.ImageTypeSpecifier.createFromRenderedImage (Unknown Source) \t в javax.imageio.ImageIO.getWriter (Unknown Source) \t в javax.imageio.ImageIO.write (Unknown Source) –

+0

Почему вам нужен целочисленный массив ? Значения RGB идут от 0 до 255. – MxyL

1

Вы можете перестроить изображение вручную, но это довольно дорогостоящая операция.

BufferedImage image = new BufferedImage(64, 64, BufferedImage.TYPE_INT_RGB); 
Graphics g = image.getGraphics(); 

for(int i = 0; i < pixels.size(); i++) 
{ 
    g.setColor(new java.awt.Color(pixels.get(i).getRed(), pixels.get(i).getGreen(), pixels.get(i).getBlue())); 
    g.fillRect(pixels.get(i).getxPos(), pixels.get(i).getyPos(), 1, 1); 
} 

try 
{ 
    ImageIO.write(image, "PNG", new File("imageName.png")) 
} 

catch(IOException error) 
{ 
    error.printStackTrace(); 
} 

Я отформатировал массив изображения в объект, это личные предпочтения Тхо (конечно, вы могли бы нам целочисленный массив с этой моделью, а). Имейте в виду, что вы всегда можете добавить альфу туда.

1

Если у вас есть массив целых чисел, которые упакованы значения RGB, это Java-код, чтобы сохранить его в файл:

int width = 100; 
int height = 100; 
int[] rgbs = buildRaster(width, height); 

DataBuffer rgbData = new DataBufferInt(rgbs, rgbs.length); 

WritableRaster raster = Raster.createPackedRaster(rgbData, width, height, width, 
    new int[]{0xff0000, 0xff00, 0xff}, 
    null); 

ColorModel colorModel = new DirectColorModel(24, 0xff0000, 0xff00, 0xff); 

BufferedImage img = new BufferedImage(colorModel, raster, false, null); 

String fname = "/tmp/whatI.png"; 
ImageIO.write(img, "png", new File(fname)); 
System.out.println("wrote to "+fname); 

Причиной массивов 0xff0000, 0xff00, 0xff является то, что байты RGB упакованы синий в младшем значении байта. Если вы упаковываете свои ints разными, измените этот массив.

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