2012-03-21 111 views
2

我有一個java se 6應用程序,它接收10到15 BufferedImage。提高圖像應用程序性能

應用程序必須在共享內存中寫入這些BufferedImage以便C程序讀取並顯示圖像。

問題是圖像很大,從1900 * 1600到800 * 600,而ImageIO在字節[]中的轉換需要很長時間:最大圖像需要50ms。我需要這個byte []來寫入內存,而ImageIo是我找到的最快速的方式。

如果我有4倍大的圖像,它需要50 * 4 = 200毫秒刷新圖像:(

你有任何想法我怎麼能提高呢? 我應該關心1圖像中1線?我將有15個線程和CPU已經工作的60%左右

回答

0

而不是使用ImageIO的寫入圖像。你嘗試過的getPixels()。 的ImageIO的數據寫入/特定的編解碼器像TIFF MJPEG。 你需要它的實際數據(像素) 現在你需要編寫C代碼才能夠渲染像素 (how你打算將數據傳遞給C代碼嗎?指針???)。

+0

不幸的是我沒有更多時間來完整地嘗試它:( 與我最後的測試,似乎,出人意料地給出了下面的基準,getPixels具有良好的回答時間。 如果人們正在努力改進他們的過程,他們應該嘗試一下,也許可以證實? – Foobyto 2012-04-05 14:03:12

0

這裏是基準反饋我拼命地跑:

resumse:似乎是ImageIO的圖像處理最優化的類。

過程:的BufferedImage =>字節[] =>字節] => INT [] =>寫
注:在字節使用的ImageIO用於轉換圖像[]

圖像1900 * 1600
從的BufferedImage得到一個字節[]:45毫秒
鑄造字節[]烯字節[]:0毫秒
寫在存儲器:4 A 9毫秒

伊馬GE 1280 * 1024
從BufferedImage的得到一個字節[]:20 A 23毫秒
鑄造字節[]烯字節[]:0毫秒
寫在存儲器:4 A 7毫秒

圖像800 * 600
得到的BufferedImage一個字節[]:9毫秒
鑄造字節[]烯字節[]:0毫秒
寫在備忘錄:3 5毫秒

==>線性處理,所述最好的,我們可以得到

過程:BufferedImage的=> INT [] =>寫
注:在INT使用的getRGB用於轉換圖像[]

圖像1900 * 1600:2500毫秒

==>的getRGB得到每個圖像像素:300萬,你必須寫:太長時間


過程:BUF feredImage =>柵格=>的DataBuffer =>寫

從BufferedImage的獲得的DataBuffer:0毫秒
寫在備忘錄:2500毫秒

圖像1900 * 1600:2500毫秒

== > DataBuffer的大小爲3百萬,寫入時間過長