2011-01-22 2 views
1

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

// 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) для каждого пикселя.

ответ

2

Я уверен, что каждый 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.

+0

127 сделал все это ложным, я попробовал (1), и все получилось нормально, не знаю почему :) :) –

+0

спасибо большое за ваши усилия. –

+0

Да, я исправил его сейчас – KitsuneYMG

0

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

1

Вы можете сделать некоторые вещи, как это,

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

Надеется, что это помогает !!

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