2016-11-18 5 views
0

Были попытки уменьшить масштаб изображения до разного масштаба, но у меня возникли проблемы. Контекст находится внутри видеопроигрывателя (с использованием VLCJ).ArrayIndexOutOfBoundsException при попытке масштабирования

Этот код используется для масштабирования изображения, но после первого кадра изображение по какой-либо причине перестает обновляться по следующему изображению.

public void newFrameRecieved(int[] rgbBuffer) 
{ 
    this.image.setRGB(0, 0, this.size.width, this.size.height, rgbBuffer, 0, this.size.width); 


    after = new BufferedImage(this.getWidth(), this.getHeight(), this.image.getType()); 
    at = new AffineTransform(); 
    scalingFactorX = (double)this.getWidth()/ (double)this.image.getWidth(); 
    scalingFactorY = (double)this.getHeight()/ (double)this.image.getHeight(); 
    at.scale(scalingFactorX, scalingFactorY); 
    scaleOp = new AffineTransformOp(at, AffineTransformOp.TYPE_BILINEAR); 
    this.image = scaleOp.filter(this.image, after); 


    repaint(); 
} 

Если средняя часть (весь код между this.image.setRGB (......) и перекрасить();) удаляется, то он работает (за исключением масштабирования части ...)

Поймите ли вы любую помощь, которую вы, ребята, можете предложить! Ошибка получил следующий:

JNA: Callback uk.co.capr[email protected]4516af24 threw the following exception: 
java.lang.ArrayIndexOutOfBoundsException: Coordinate out of bounds! 
    at sun.awt.image.IntegerInterleavedRaster.setDataElements(IntegerInterleavedRaster.java:301) 
    at java.awt.image.BufferedImage.setRGB(BufferedImage.java:1059) 
    at myVlcjWrapper.VideoSurfacePanel.newFrameRecieved(VideoSurfacePanel.java:65) 

Я понимаю проблему, я просто невежественный, как это исправить! Спасибо!

+0

Насколько велико ваше изображение, которое вы пытаетесь масштабировать? в пикселях – D3181

+0

Что делает 'image.setRGB'? – bradimus

+0

Поскольку это поток видео в реальности, я не могу сказать, что я уверен. Но я уверен, что это 1920x1080! – Payerl

ответ

0

После многих поисков ошибок я закончил с этой частью рабочего кода!

public void newFrameRecieved(int[] rgbBuffer, Dimension max) 
{ 
    before = new BufferedImage(max.width, max.height, BufferedImage.TYPE_INT_ARGB); 
    before.setRGB(0, 0, max.width, max.height, rgbBuffer, 0, max.width); 
    after = new BufferedImage(this.getWidth(), this.getHeight(), this.image.getType()); 
    at = new AffineTransform(); 
    scalingFactorX = (double)after.getWidth()/ (double)before.getWidth(); 
    scalingFactorY = (double)after.getHeight()/ (double)before.getHeight(); 
    at.scale(scalingFactorX, scalingFactorY); 
    scaleOp = new AffineTransformOp(at, AffineTransformOp.TYPE_BILINEAR); 
    this.image = scaleOp.filter(before, after); 

    repaint(); 
} 

Это минимальное изменение, но это было трюк! Думал, что лучше всего опубликовать его на случай, если кто-то снова найдет их здесь. Спасибо за помощь, ребята! :)

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