2016-08-25 2 views
0

단색 PNG 이미지 (단색으로 채워진 비트 맵)를 생성하고 저장해야합니다.안드로이드에서 단색 PNG 비트 맵을 생성하고 저장하는 동안 메모리 사용량을 줄입니다.

내가 비트 맵 만드는거야 :

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; 
} 

및 장치 스토리지의 파일에 저장이 :

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

나는 1200 × 1200 비트 맵을 작성하는 경우, 메모리 소비는 5,760,000 바이트 (이다 5.76 MB), 으로보고 됨 bitmap.getAllocationByteCount(). 그러나 PNG 파일 크기는 8,493 바이트입니다.

파일 크기가 8KB에 불과하므로 거의 6MB의 메모리를 할당하는 것이 과도한 것처럼 보입니다.

더 나은 방법이 있습니까?

+0

왜? ColorDrawable을 사용하는 것이 좋습니다. –

+0

@GabeSechan 메모리에 비트 맵을 할당하지 않고 PNG 파일에 ColorDrawable을 직접 쓸 수 있습니까? – 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는 압축 된 형식이므로 단일 색상 이미지가 많이 압축되므로 메모리에 할당 된 공간과 인코딩 된 이미지 크기를 비교하는 것은 이치에 맞지 않습니다. 편집 가능한 비트 맵 (안드로이드에서는 Bitmap, ImageIO에서는 BufferedImage, PILJ에서 내 ImageLineByte 등)은 실제로 압축되지 않으므로 항상 픽셀 당 4 바이트를 낭비합니다. 그리고 그것을 확인할 수 있습니다 : 1200x1200x4 = 5760000.

0

단 하나의 색상으로 비트 맵을 채우기 만하면됩니다. SharedPreferences에 색상을 저장하는 것이 가장 좋은 이유는 무엇입니까?

훨씬 더 효율적입니다.

뷰의 색상 배경을 설정할 수도 있습니다.

다른 옵션은 크기가 1x1 픽셀이고 필요한 색상으로 비트 맵을 만들고 배경으로 사용됩니다. View의 크기가됩니다.

P.

ALPHA_8은 (는) 알파 만 색을 저장하지 않습니다. 완전히 잘못되었으므로 설명서를 확인하십시오.

+0

질문을 읽었습니까? 그 비트 맵을 PNG 파일로 쓰고 장치 저장소에 저장해야합니다. 내가보기를 배경으로 설정하고 싶지 않습니다. (ALPHA_8 팁을 주셔서 감사하지만 문서에 충분한주의를 기울이지 않았습니다.) – AnAurelian

+0

색상이 알파를 사용하지 않으면 RGB_565 구성을 사용하십시오. 비트 맵을 저장 한 후에는 recycle() - d가 필요합니다. –