Java начинающий: преобразовать изображение в двоичный массив - PullRequest
1 голос
/ 22 января 2011

это то, что я зашел так далеко, и я не могу идти дальше, потому что я не понимаю побитовые операции с RGB

// Read from a file
File file = new File("src/a.gif");
image = ImageO.read(file);
int[] rgbarr = image.getRGB(0, 0, 13, 15, null, 0, 13);// image is 13*15 
System.out.println(rgbarr.length);
for (int i : rgbarr)
    {
        System.out.println(i);
    }

Вывод: были значения, такие как-16777216 и -1 Поскольку я уже сделал черно-белое изображение, чтобы облегчить мое понимание

Но в нашем случае давайте предположим, что это будет просто случайное изображение, как мне получить от нормальногоИзображение RGB в двоичные значения (0 или 1) для каждого пикселя.

Ответы [ 3 ]

2 голосов
/ 22 января 2011

Держу пари, что каждое int в массиве является упакованным значением ARGB;

boolean [] output = new boolean[rgbarr.length];
for ( int i=0; i<rgbarr.length; ++i ) {
  int a = (rgbarr[i] >> 24 ) & 0x0FF;
  int r = (rgbarr[i] >> 16 ) & 0x0FF;
  int g = (rgbarr[i] >> 8  ) & 0x0FF;
  int b = (rgbarr[i]       ) & 0x0FF;
  output[i] = (0.30*r + 0.59*g + 0.11*b) > 127;
}

Выбранное уравнение вывода было взято из определения яркости из Википедии.Вы можете изменить весы до тех пор, пока коэффициенты не составят 1.

1 голос
/ 22 января 2011

Вы можете сделать что-то вроде этого,

BufferedImage img = (BufferedImage) image;
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageIO.write(img , "jpg", baos);
byte[] previewByte = baos.toByteArray();

Надеюсь, это поможет !!

0 голосов
/ 22 января 2011

У вас уже есть значения RGB в int [], то есть цвет каждого пикселя. Вы можете сравнить это с определенным цветом фона, таким как черный, чтобы получить значение 1-битного пикселя. Затем, возможно, установите бит в другой массив байтов соответствующего размера [] ...

...