亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

更多內存優化版本的 Bitmap.createScaledBitmap?

更多內存優化版本的 Bitmap.createScaledBitmap?

慕森王 2023-03-17 14:11:39
我完全理解“過早的優化是萬惡之源”。但是,我已經到了一個地步,我認為我想做的優化不能再被認為是“過早的”。我正在編寫一個 Android 應用程序,除其他外,它從 USB 設備流式傳輸實時圖像提要,使用 OpenCV 執行一些圖像處理,將幀轉換為位圖,然后將該位圖實時渲染到 SurfaceView。我讓一切正常,(實時提要正確呈現到 SurfaceView)并且 Android Studio 的“Profiler”工具表明我已經很好地完成了內存管理(請注意,垃圾收集器不會在下面顯示的 10 秒內運行一次) :但是,因為我流式傳輸的圖像分辨率較低 (320x180),當我將它直接渲染到 SurfaceView 時,它實際上最終在設備屏幕上非常小。因此,我決定在將位圖渲染到屏幕之前將位圖縮放到適合 SurfaceView 的最大尺寸。然而,在這樣做之后,我驚恐地發現內存使用圖現在看起來很可怕?。ɡ占髅棵脒\行不止一次!)以下是相關的代碼片段:在縮放位圖之前(清理內存圖):canvas = getHolder().lockCanvas();openCvMat = frameQueue.take();Utils.matToBitmap(openCvMat, bitmapFromMat);mat.release();canvas.drawColor(Color.BLACK);canvas.drawBitmap(bitmapFromMat, 0, 0, null);getHolder().unlockCanvasAndPost(canvas);縮放位圖后(可怕的內存圖):canvas = getHolder().lockCanvas();openCvMat = frameQueue.take();Utils.matToBitmap(openCvMat, bitmapFromMat);mat.release();canvas.drawColor(Color.BLACK);Bitmap scaled = scaleBitmapToViewport(bitmapFromMat);canvas.drawBitmap(scaled, 0, 0, null);scaled.recycle();getHolder().unlockCanvasAndPost(canvas);scaleBitmapToViewport()方法:private Bitmap scaleBitmapToViewport(Bitmap bitmap){    //Landscape    if((canvas.getHeight() * aspectRatio) < canvas.getWidth())    {        return Bitmap.createScaledBitmap(bitmap, (int) Math.round(canvas.getHeight() * aspectRatio), canvas.getHeight(), true);    }    else //Portrait    {        return Bitmap.createScaledBitmap(bitmap, canvas.getWidth(), (int) Math.round(canvas.getWidth() / aspectRatio), true);    }}所以這似乎Bitmap.createScaledBitmap()是罪魁禍首。有誰知道另一種方法來完成同樣的事情,而不是讓垃圾收集器賺錢?
查看完整描述

1 回答

?
千萬里不及你

TA貢獻1784條經驗 獲得超9個贊

而不是像你正在做的那樣縮放位圖本身 - 你不能在繪圖時縮放嗎?

我正在查看canvas.drawBitmap(位圖位圖、Rect src、Rect dst、Paint paint)——請注意,它采用源矩形和目標矩形。

您需要將源設置為您的(?。﹫D像尺寸,將目標設置為表面尺寸。


查看完整回答
反對 回復 2023-03-17
  • 1 回答
  • 0 關注
  • 112 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號