2017-11-30 22 views
-1

以下のヘルパー関数は、入力ビットマップの上に矩形を描き、サムネイルのビットマップを返します。しかし、サムネイルのリストを作成するためにアクティビティからこのヘルパーを約1000回呼び出すと、JavaのOutOfMemoryエラーが発生します。 tempScaledBitmapのサイズを375,500に変更しようとしましたが、サムネイル画像の品質が悪いです。Android:画像を効率的に描画する

また、私はinputBitmapをそのまま変更することができませんでした。 アクティビティに1000プラスサムネイルのリストを表示する効率的な方法は何ですか?

private static Bitmap drawOnCanvas(Bitmap inputBitmap, FramePoint[] points, ColorCode colorCode){ 
    Bitmap tempScaledBitmap = Bitmap.createScaledBitmap(inputBitmap, 750, 1000, false); 
    //draw path 
    Canvas canvas = new Canvas(tempScaledBitmap); 

    // Path 
    Paint paint = new Paint(); 
    paint.setStyle(Paint.Style.STROKE); 
    paint.setColor(colorCode.equals(ColorCode.GREEN)?Color.GREEN:(colorCode.equals(ColorCode.RED)?Color.RED:Color.BLUE)); 
    paint.setStrokeWidth(5); 
    Path p = new Path(); 
    p.moveTo(points[0].getPointX(), points[0].getPointY()); 
    p.lineTo(points[1].getPointX(), points[1].getPointY()); 
    p.lineTo(points[2].getPointX(), points[2].getPointY()); 
    p.lineTo(points[3].getPointX(), points[3].getPointY()); 
    p.close(); 
    canvas.drawPath(p, paint); 
    return tempScaledBitmap; 
} 

答えて

0

drawOnCanvasへの各呼び出しの後、あなたのビットマップをリサイクルする必要があります彼らはImageViewsまたはどここのOOMのエラーを防ぐために割り当てられた後

inputBitmap.recycle(); 

もtempScaledBitmapをリサイクル。

また、picassoまたはglideを使用することもできます。私の場合は、すべての中で最良の選択です。

+0

私はリサイクルがイメージの解放/削除と同等であることを確認します。しかし、私は両方の画像、入力画像とtempScaledImageの両方を描画する必要があります。 –

+0

しかし、1000枚の画像をメモリに保存することはできません。次のサムネイルを読み込む前に、各サムネイルを解放する必要があります。ピカソやグライドのようなライブラリを使うことを考えましたか?あなたの最善の選択肢かもしれませんし、最適化されています。 – jeprubio

関連する問題