2015-08-06 8 views
0

Я пытаюсь сделать некоторые манипуляции с изображениями, используя IConverter класс, который включен в Xuggle библиотеки для преобразования изображений из IVideoPicture типа для BufferedImage типа но я встречаю ошибку в названии.java.awt.image.RasterFormatException: массив данных слишком мал (должен быть> 388799)

Вот мой код:

BufferedImage orgnlimage = new BufferedImage(Picture.getWidth(), Picture.getHeight(), BufferedImage.TYPE_3BYTE_BGR); 
IConverter converter = ConverterFactory.createConverter(orgnlimage, IPixelFormat.Type.BGR24); 
orgnlimage = converter.toImage(Picture); // Exception on this line 

Размеры изображения в вопросе, является 360x360.

Это исключение я получаю:

Exception in thread "main" java.awt.image.RasterFormatException: Data array too small (should be > 388799) 
    at sun.awt.image.ByteComponentRaster.verify(ByteComponentRaster.java:947) 
    at sun.awt.image.ByteComponentRaster.<init>(ByteComponentRaster.java:201) 
    at sun.awt.image.ByteInterleavedRaster.<init>(ByteInterleavedRaster.java:191) 
    at sun.awt.image.ByteInterleavedRaster.<init>(ByteInterleavedRaster.java:113) 
    at java.awt.image.Raster.createWritableRaster(Raster.java:980) 
    at com.xuggle.xuggler.video.BgrConverter.toImage(BgrConverter.java:195) 
    at xuggler.Encrypt.main(Encrypt.java:53) 
    at xuggler.DecodeAndSaveAudioVideo.main(DecodeAndSaveAudioVideo.java:141) 

Мой второй attemp:

public IVideoPicture main(IVideoPicture Picture) throws NoSuchPaddingException, IllegalBlockSizeException, BadPaddingException, IOException 
{ 
     int width = Picture.getWidth(); 
     int height = Picture.getHeight(); 
     long timestamp = Picture.getTimeStamp(); 

BufferedImage orgnlimage = videoPictureToImage(Picture); 


     byte[] orgnlimagebytes =toByte(orgnlimage); 
     byte[] encryptedbytes = encrypt(orgnlimagebytes, "abc"); 
     //System.out.println(encryptedbytes.length); 

     BufferedImage encryptedimage = toImage(encryptedbytes, width, height); 

     String desc = ConverterFactory.findDescriptor(encryptedimage); 
     IConverter converter = ConverterFactory.createConverter(desc, Picture); 


     IVideoPicture Pic = converter.toPicture(encryptedimage, timestamp); 

     return Pic; 

} 

и трассировки стека:

Exception in thread "main" java.nio.BufferOverflowException 
at java.nio.DirectByteBuffer.put(DirectByteBuffer.java:363) 
at java.nio.ByteBuffer.put(ByteBuffer.java:859) 
at com.xuggle.xuggler.video.BgrConverter.toPicture(BgrConverter.java:132) 
at xuggler.Encrypt.main(Encrypt.java:62) 
at xuggler.DecodeAndSaveAudioVideo.main(DecodeAndSaveAudioVideo.java:141) 
+0

У вас есть трассировка стека, возможно? На какой строке вы получите «RasterFormatException»? Кроме того, каковы размеры вашего изображения? – haraldK

+0

ошибка находится в последней строке, а размеры взяты из изображения IPicture. –

+0

Я имел в виду, каковы размеры, буквально (например, 120x120 или аналогичные)? И, вы * должны * включить трассировку стека, в вопрос. – haraldK

ответ

1

Проблема заключается в том, что по какой-то причине , метод Xuggler BgrConverter.toImage() пытается создать растр вокруг массива byte e 388799, который является одним байтовым коротким ... Он должен был быть размером 388800 (360 * 360 * 3) для вашего изображения в формате BGR.

Я бы сказал file a bug report.

Или попробуйте Humble Video вместо этого, который, похоже, является преемником Xuggler.

+0

Спасибо .. честно, я чувствовал себя немного потерянным в ситуации, поэтому я попробовал другой способ выполнить эту работу, но я получил исключение переполнения буфера, и я не знал, как это исправить .. У тебя есть какая-то идея? я буду утверждать это в вопросе –

+0

Предлагаю вам задать новый вопрос. – haraldK

+0

OK я буду :) сэр, вы уже работали над Xuggler? –