2013-11-16 6 views
1

Я хочу сохранить значение RGB в массиве пикселей следующим образом:DataBufferByte не может быть передан в DataBufferInt?

pixels = ((DataBufferInt) image.getRaster().getDataBuffer()).getData(); 

где image является:

BufferedImage image = new BufferedImage(100,100,BufferedImage.TYPE_INT_RGB); 

Я прочитал файл, используя ImageIO и прочитать штраф, именно эта часть, проблема , Вот ошибка:

Exception in thread "main" java.lang.ClassCastException: java.awt.image.DataBufferByte cannot be cast to java.awt.image.DataBufferInt 
at SpritePractice.render(SpritePractice.java:114) 
at SpritePractice.run(SpritePractice.java:75) 
at SpritePractice.start(SpritePractice.java:124) 
at SpritePractice.main(SpritePractice.java:132) 

и пикселей приведен целочисленный массив следующим образом: int[] pixels
Что мне делать? Как побочный вопрос, может кто-нибудь объяснить кастинг и что он делает? благодаря!

EDIT:

image.getRaster().getDataBuffer() распечатываются на консоли

Heres выход:

[email protected] 

Очевидно, что что-то здесь не так. Я уточнил, что BufferedImage image = new BufferedImage(100,100,BufferedImage.TYPE_INT_RGB); и читает DataBufferByte ...

+0

здесь вы идете http://docs.oracle.com/javase/specs/jls/se7/html/jls-5.html – Nishant

+0

Я не понимаю, почему это не работает, BufferedImage.TYPE_INT_RGB должен хранить данные изображения в int [], он работает для меня. ((DataBufferInt) img.getRaster(). GetDataBuffer()) \t \t \t \t .getData() подтверждает это – arynaq

+0

Вы уверены, что это изображение вызывает ошибку, а не какой-то другой образ? – arynaq

ответ

1

Вы, вероятно, делают это неправильно. :-)

BufferedImage image = new BufferedImage(100,100,BufferedImage.TYPE_INT_RGB); 

... должен создать изображение с IntegerInterleavedRasterDataBufferInt и (это делает для меня на OS X, используя весь свой установленный Java 6 и 7 JREs). Попробуйте распечатать растровый и буфер данных сразу после создания. Я уверен, что он напечатает то, что вы изначально ожидали.

Спекулятивный Ответ ниже:

Вы не отправил соответствующие части вашего кода, но я думаю, на основе замечаний, которые вы а) создание пустого изображения и присваиваем его image, то б) чтение другого изображения с использованием ImageIO и присвоение результата image, заменив предыдущее значение image. Теперь изображение имеет растровый и буфер данных байта типа. Затем вы пытаетесь применить тип int и бум.

Теперь можно сделать ImageIO прочитанным в предварительно созданном BufferedImage или просто указать тип. Но это зависит от плагина и источника (т. Е. Нет гарантии, что он поддержит TYPE_INT_RGB). Для запроса читателя, каким именно образом он поддерживает макеты, сделать что-то вроде:

ImageInputStream stream = ...; 
Iterator<ImageReader> readers = ImageIO.getImageReaders(stream); 
if (readers.hasNext()) { 
    ImageReader reader = readers.next(); 

    try { 
     reader.setInput(stream); 

     ImageReadParam param = reader.getDefaultReadParam(); 

     Iterator<ImageTypeSpecifier> specs = reader.getImageTypes(); 

     while (specs.hasNext()) { 
      ImageTypeSpecifier spec = specs.next(); 

      if (/*spec is for TYPE_INT_RGB*/) { 
       // Either pass your pre-allocated image: 
       reader.setDestination(image); 

       // *OR* simply tell the reader what type you like the result to be: 
       reader.setDestinationType(spec); 
      } 
     } 

     // TODO: Handle the case where there's no match among the ImageTypeSpecifiers 

     // In case image was passed, it will be the same image returned here 
     image = reader.read(0, param); 
    } 
    finally { 
     reader.dispose(); 
    } 
} 

Casting делает то, что он всегда делал, но я не думаю, что это ваша проблема. ;-)

+0

Спасибо за ваш help :) – user2052855

+0

Добро пожаловать. :-) – haraldK

0

Это не так трудно понять:

DataBufferByte и DataBufferInt как продлить DataBuffer так они в основном на разных ветвях иерархии классов.

Это похоже на попытку применить различные реализации одного и того же интерфейса друг к другу.

+0

Проблема в том, что тип не такой, какой он должен быть, проверьте мой комментарий к OP. – arynaq

0

image.getRaster().getDataBuffer()).getData(); имеет тип java.awt.image.DataBufferByte как выведено из исключения.

Вы пытаетесь преобразовать i.e java.awt.image.DataBufferByte в java.awt.image.DataBufferInt, которые не лежат в одной иерархии наследования.

Запомни,

You can cast a sub type to super type (Liskov Substitution Principle). 
When casting a super type to sub type a `ClassCasteException` will be thrown. 
Also, if you attempt to cast classes which do not lie in the same inheritance 
hierarchy will always throw `ClassCasteException` at runtime. 
+0

Должен ли быть DataBufferInt, поскольку я устанавливаю BufferedImage для ввода типа: 'TYPE_INT_RGB'? – user2052855

+0

@ user2052855 [this] (http://stackoverflow.com/questions/15839223/java-awt-image-databufferbyte-cannot-be-cast-to-java-awt-image-databufferint) может помочь вам – Nishant

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