2015-01-22 2 views
-1

Я видел поток при преобразовании BufferedImage в массив пикселей/байтов. Использование getRGB непосредственно на изображении работает, но не идеально, поскольку слишком медленно собирать все пиксели. Я попробовал альтернативный способ просто захватить пиксельные данные.Java BufferedImage to pixel array

//convert canvas to bufferedimage 
    BufferedImage img = new BufferedImage(500, 500, BufferedImage.TYPE_3BYTE_BGR); 
    Graphics2D g2 = img.createGraphics(); 
    canvas.printAll(g2); 
    g2.dispose(); 

    System.out.println(img.getRGB(0, 0)); //-16777216 works but not ideal 

    byte[] pixels = ((DataBufferByte) img.getRaster().getDataBuffer()).getData(); 
    for(byte b : pixels){ 
     System.out.println(b); //all 0 doesnt work 
    } 

Однако весь массив байтов кажется пустым (заполнен 0s).

ответ

1

Я не знаю, что означает canvas в вашем коде, но это работает отлично:

import java.awt.Color; 
import java.awt.Graphics2D; 
import java.awt.image.BufferedImage; 
import java.awt.image.DataBufferByte; 

public class Px { 

    public static void main(String[] args) { 
     new Px().go(); 
    } 

    private void go() { 
     BufferedImage img = new BufferedImage(5, 5, BufferedImage.TYPE_3BYTE_BGR); 
     Graphics2D g2 = img.createGraphics(); 
     g2.setColor(Color.red); 
     g2.fillRect(0, 0, 2, 2); 
     g2.dispose(); 

     byte[] pixels = ((DataBufferByte) img.getRaster().getDataBuffer()).getData(); 
     for (byte b : pixels) { 
      System.out.print(b + ","); 
     } 
    } 
} 

Результат таков:

0,0,-1,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 

Цвет заказ синий зеленый красный. Таким образом, мой красный прямоугольник появляется как байты в 0,0, -1,0,0, -1 и т. Д. Я предполагаю, что -1 является «тем же», что и 255.

Вы можете изучить вашу линию canvas.printAll(). Возможно, в холсте содержатся только черные пиксели.

+0

Но это оставляет вопрос: почему работает 'getRGB'? – John

+0

байт в java является подписанным типом. С его 8 бит вы можете отображать числа от -128 до +127. Однако байты изображения обычно не подписаны. Итак, что произойдет, если вы перейдете без знака байта 255 = (11111111) к подписанному? Проверьте http://en.wikipedia.org/wiki/Two%27s_complement – xmoex

+0

Документ getRGB сообщает мне, что используемая модель TYPE_INT_ARGB. Возможно, есть значение для альфы. Я не хочу погружаться в это. Я попробовал другую функцию под названием getPixel. Поэтому img.getData(). GetPixel (...) заполняет массив int (в моем случае красного) 255,0,0. Мне кажется, что я краснею :) – chris