2016-06-07 11 views
1

Я хочу преобразовать 1-D байт-массив пикселей изображения в 1-D целочисленный массив. У меня есть следующий код, как показано ниже:Преобразование массива 1D байт в массив 1D Integer

Byte[] pixels = (Byte[]) img.getRaster().getDataElements(0, 0, width, height, null); 

int[] array = new int[pixels.length]; 

for (int k = 0; k < pixels.length; k++);{ 
    array[k] = pixels[k++]; 
} 

Всякий раз, когда я компиляция этого кода, я получаю ниже исключение во время выполнения: Исключения в потоке «основной» java.lang.ClassCastException: [B не может быть брошен к [Ljava.lang.Byte;

+0

Сторона примечания: в случае 'img.getRaster()' ваш собственный код --- не возвращайте массив байтов, а байт. Вы действительно хотите быть осторожным в том, что компилятор делает бокс/распаковку повсюду; так как такие вещи могут существенно повлиять на производительность на больших наборах данных. – GhostCat

+0

Я пробовал, но опять получаю то же исключение: Исключение в потоке "main" java.lang.ClassCastException: [B нельзя отбрасывать на [Ljava.lang.Byte; –

+0

@ Jägermeister 'img.getRaster()' не является настраиваемым кодом, но скорее всего 'BufferedImage # getRaster()'. – Thomas

ответ

1

Пиксели - это массив объектов Byte. Вы пытаетесь присвоить его массиву int. Вы должны иметь что-то вроде этого: array[k] = pixels[k++].intValue();

3

я вижу 3 проблем в коде

  1. Чтобы преобразовать Byte к примитивному типу int вам нужно позвонить intValue()
  2. Вы увеличиваете в два раза превышающие локальные переменную k таких что вы превысите размер вашего массива
  3. Вы делаете недействительный литой по вашему исключению, getDataElements возвращает

Ссылка на объект в массив типа, определенного getTransferType() запрошенные данные пикселей.

Так что вы должны сначала проверить getTransferType(), чтобы узнать, как правильно его использовать. Но, похоже, это массив примитивного типа byte вместо массива класса обертки Byte, так что Byte[] pixels должен быть byte[] pixels.

Таким образом, ожидаемый код должен быть:

for (int k = 0; k < pixels.length; k++);{ 
    array[k] = pixels[k]; 
} 
1

Проблема заключается в том, что Raster#getDataElements() возвращает byte[] массив ([B) в вашем случае (img.getRaster() возвращает и тип WritableRaster растра наиболее вероятно DataBuffer.TYPE_BYTE). Тем не менее, вы пытаетесь передать это массиву Byte[] ([Ljava.lang.Byte), который является чем-то другим, и поскольку автоматическое преобразование не существует, вы получаете ClassCastException.

Вместо этого используйте код byte[], и все должно быть хорошо.

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