улучшить производительность приложения изображения - PullRequest
2 голосов
/ 21 марта 2012

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

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

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

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

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

Ответы [ 2 ]

0 голосов
/ 05 апреля 2012

Вот отзывы о тесте, который я запустил:

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

Процесс: BufferedImage => byte [] => Byte [] => int [] => write
примечание: использование ImageIO для преобразования изображения в байтах []

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

изображение 1280 * 1024
получить байт [] из BufferedImage: 20–23 мс
Байт приведения [] en Байт []: 0 мс
запись в память: 4–7 мс

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

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

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

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

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


Процесс: BufferedImage => Растр => DataBuffer => запись

получить DataBuffer из BufferedImage: 0 мс
написать в мемуаре: 2500 мс

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

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

0 голосов
/ 21 марта 2012

вместо записи изображений с помощью imageio.Вы пробовали GetPixels ().imageio записывает данные в определенный кодек, такой как TIFF / MJPEG.что вам нужно, это фактические данные (в пикселях).Теперь вам нужно написать код C, чтобы иметь возможность визуализировать пиксели.(как вы планируете передавать данные в код C? указатели ???).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...