В целом:
обработка изображений всегда требует больших затрат, поэтому для этих задач используется векторизация или аппаратное ускорение. Простой цикл по изображению всего одним потоком уже очень медленный, особенно в java. Кроме того, люди склонны использовать Color
объекты для изменения цвета, что очень медленно.
Чистая Java:
если вы хотите, чтобы ваш код был написан на чистой Java. Вы должны проверить, какой внутренний формат используется для WriteableImage
, вызвав:
myImage.getPixelWriter().getPixelFormat().getType()
Если внутренний формат не RGB, адаптируйте преобразование цвета к данному формату, чтобы избежать двойного преобразования. Кроме того, убедитесь, что ваш код максимально оптимизирован:
-Не используйте никакие объекты, кроме массивов
-Сведите к минимуму использование локальных переменных
Вы также можете попробовать многопоточность процесса преобразования с помощью параллельных циклов. .
JNI:
Отход от Java открывает множество возможностей. Существует несколько независимых от платформы библиотек для преобразования YUV в RGB и обратно:
OpenCV:
Прост в использовании и уже поставляется с Java API:
byte[] myYuvImage = null; //your image here
byte[] myRgbImage = new byte[width * height * 3]; //the output image
Mat yuvMat = new Mat(height, width, CvType.CV_8UC2); //YUV422 should be 2 channel
Mat rgbMat = new Mat(height, width, CvType.CV_8UC3);
yuvMat.put(0,0, myYuvImage);
Imgproc.cvtColor(yuvMat, rgbMat, Imgproc.COLOR_YUV2RGB_Y422);
rgbMat.get(0, 0, myRgbImage);
Intel IPP:
доступно только через JNI. Вы должны использовать ippiRGBToYUV422_8u_C3C2R
для получения дополнительной информации см. RGBToYUV422.
SwScale как часть FFmpeg:
доступно только через JNI. См. этот ответ и адаптируйте пример.
Мой личный опыт показывает, что IPP обеспечивает лучшую производительность даже на машинах AMD. Однако лицензия, с которой он поставляется, может быть бесплатной, но запрещает декомпиляцию, которая может быть несовместима с библиотеками LGPL.
person
Crigges
schedule
22.08.2018