2012-03-21 4 views
2

У меня есть приложение java se 6, которое получает от 10 до 15 BufferedImage.улучшить производительность приложения изображения

Приложение должно написать эти BufferedImage в общей памяти, чтобы программа C могла ее прочитать и отобразить.

Проблема заключается в том, что изображения большие, от 1900 * 1600 до 800 * 600, а преобразование в байте [] с ImageIO занимает много времени: 50 мс для самых больших изображений. Мне нужен этот байт [] для записи в память, а ImageIo - самый быстрый способ, который я нашел.

Если у меня есть 4 больших изображений, это займет 50 * 4 = 200 мс, чтобы обновить изображение :(

У вас есть какие-либо идеи, как я мог бы улучшить его? Если я забочусь о 1 изображение в 1 нить ? Я буду иметь 15 темы, а процессор уже работает около 60%

ответ

0

вместо записи изображений с помощью ImageIO. вы пробовали GetPixels(). ImageIO записывает данные на определенный кодек, как TIFF/MJPEG. что вам нужны его фактические данные (пиксели). теперь вам нужно написать код C, чтобы иметь возможность отображать пиксели. (how вы планируете передавать данные в код C? указатели ???).

+0

К сожалению, у меня не было больше времени, чтобы попробовать его полностью :( С моими последними испытаниями кажется, что, на удивление учитывая приведенный ниже критерий, getPixels имеет хорошее время ответа. Если люди пытаются улучшить свой процесс, им следует попробовать и, возможно, подтвердить это? – Foobyto

0

Здесь обратная связь от теста я запущенный:

resumse: кажется, что ImageIO является наиболее оптимизированным классом для обработки изображений.

процесса: BufferedImage => байт [] => Байт [] => INT [] => написать
примечание: использование ImageIO для преобразования изображения в байте []

изображение 1900 * 1600
получить байт [] от BufferedImage: 45 мс
литой байт [] ан Byte []: 0 мс
записи в память: 4 9 мс

ИМА GE 1280 * 1024
получить байт [] от BufferedImage: 20 23 мс
литой байт [] ан Byte []: 0 мс
записи в память: 4 7 мс

изображение 800 * 600
получить байт [] от BufferedImage: 9 мс
литой байт [] ан Byte []: 0 мс
записи в запиской: 3 в 5 мс

==> линейной обработки, то лучшее, что мы можем получить

процесса: BufferedImage => INT [] => написать
Примечание: используйте getRGB для преобразования изображения в межд []

изображение 1900 * 1600: 2500 мс

==> getRGB получить каждый пиксель изображения: 3 миллиона, которые вы должны написать: слишком долго


процесса: Buf feredImage => Растровые => DataBuffer => написать

получить DataBuffer от BufferedImage: 0 мс
записи в запиской: 2500 мс

изображение 1900 * 1600: 2500 мс

== > DataBuffer имеет размер 3 миллиона, время записи слишком длинное

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