2016-08-25 5 views
0

単色のPNG画像を作成して保存する必要があります(ビットマップは単色で塗りつぶします)。Androidで単色のPNGビットマップを作成して保存する際のメモリ使用量を減らす

私は、ビットマップ作成しています:私は1200x1200ビットマップを作成する場合は、メモリの消費量が576万バイト(ある

stream = new FileOutputStream(filePath); 
success = bitmap.compress(Bitmap.CompressFormat.PNG, 100, stream); 

public static Bitmap createColorSwatchBitmap(int width, int height, int color) { 
    final Bitmap colorBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); 
    colorBitmap.eraseColor(color); 
    return colorBitmap; 
} 

を、デバイスのストレージ上のファイルに保存します5.76 MB)。bitmap.getAllocationByteCount()によって報告されているとおりです。ただし、PNGファイルのサイズはわずか8,493バイトです。

8 KBしかないファイルには6 MBのメモリを割り当てるのは難しいようです。

良い方法がありますか?

+0

なぜですか? ColorDrawableを使うほうがよいでしょう。 –

+0

@GabeSechanメモリにビットマップを割り当てずに、ColorDrawableをPNGファイルに直接書き込むことはできますか? – AnAurelian

答えて

1

PNGJライブラリ(免責事項:私は著者です)を使用することができます。画像は漸進的に保存されるため、単一の行を割り当てるだけで済みます。例えば

public static void create(OutputStream os,int cols,int rows,int r,int g,int b,int a) {  
     ImageInfo imi = new ImageInfo(cols, rows, 8, true); // 8 bits per channel, alpha 
     PngWriter png = new PngWriter(os, imi); 
     // just a hint to the coder to optimize compression+speed: 
     png.setFilterType(FilterType.FILTER_NONE); 
     ImageLineByte iline = new ImageLineByte (imi); 
     byte[] scanline = iline.getScanlineByte();// RGBA 
     for (int col = 0,pos=0; col < imi.cols; col++) { 
      scanline[pos++]=(byte) r; 
      scanline[pos++]=(byte) g; 
      scanline[pos++]=(byte) b; 
      scanline[pos++]=(byte) a; 
     } 
     for (int row = 0; row < png.imgInfo.rows; row++) { 
      png.writeRow(iline); 
     } 
     png.end(); 
} 

It seems so overkill to allocate almost 6 MB of memory for a file that will only have 8 KB.

二つの異なるものがここにあります。まず、メモリ内にフルイメージを割り当てるためにスペースが無駄になります。私の解決策は、単一の行を割り当てることによって、この問題を全面的に解決します。しかし、これとは別に、概念的な誤りがあります.PNGは圧縮されたフォーマットであり(単一のカラーイメージが高度に圧縮されるため)、メモリに割り当てられた領域とエンコードされたイメージのサイズを比較するのは意味がありません。編集可能なビットマップ(Androidの場合Bitmap、ImageIOの場合はBufferedImage、PNGJの場合はImageLineByteなど)は実際には圧縮されないので、少なくとも1ピクセルあたり4バイトは無駄になります。そしてそれを確認することができます:1200x1200x4 = 5760000。

0

ビットマップを1色で塗りつぶすだけです。 SharedPreferencesに色を保存してみませんか?

これはずっと効率的です。

ただし、ビューの背景色を設定することはできますが、

その他のオプションは、必要な色でサイズ1x1ピクセルのビットマップを作成するもので、設定はバックグラウンドです。 Viewのサイズになります。

P.S.

ALPHA_8は色を保存せず、アルファのみです。それは完全に間違っている、ドキュメントを確認してください

+0

あなたはその質問を読んだことがありますか?私はこれらのビットマップをPNGファイルとしてデバイスストレージに書き込んで保存する必要があります。私はそれらをビューの背景として設定したくありません。 (ALPHA_8のヒントはありがたいですが、私はドキュメンテーションに十分な注意を払っていませんでした) – AnAurelian

+0

色がアルファを使用していない場合は、RGB_565の設定を使用してください。ビットマップが格納された後、recycle()-dが必要です –

関連する問題