2012-10-17 3 views
0
비트 맵을 반전 할 때 난에서 OutOfMemory 에러 봉착

가 .. 여기서 I는 반전하는 데 사용하는 코드이다비트 맵을 반전 할 때 OutOfMemory가 필요합니까?

public Bitmap invertBitmap(Bitmap bm) { 
     Bitmap src = bm.copy(bm.getConfig(), true); 

     // image size 
     int height = src.getHeight(); 
     int width = src.getWidth(); 
     int length = height * width; 
     int[] array = new int[length]; 
     src.getPixels(array, 0, src.getWidth(), 0, 0, src.getWidth(), src.getHeight()); 
     int A, R, G, B; 
     for (int i = 0; i < array.length; i++) { 
      A = Color.alpha(array[i]); 

      R = 255 - Color.red(array[i]); 
      G = 255 - Color.green(array[i]); 
      B = 255 - Color.blue(array[i]); 

      array[i] = Color.argb(A, R, G, B); 
     } 
     src.setPixels(array, 0, src.getWidth(), 0, 0, src.getWidth(), src.getHeight()); 

     return src; 
    } 

이미지가 80 ~ 킬로바이트 큰 치수 800x1294이며 포토 단어를 가지고 검은 색과 보이지 않는 배경 ..
이미지는 BM을 복사 할 때

답변

0

는 시도에 .. ViewPager에 있습니다 안드로이드에서 bm = null;

0

인해 16메가바이트 응용 프로그램에 대해 메모리 캡 (거의 모든 휴대폰에서) 전체 비트 맵을 메모리에 유지하는 것은 현명하지 않습니다. 이것은 일반적인 시나리오이며 개발자에게 발생할 수 있습니다.

이 문제에 대한 많은 정보는 this stackoverflow 스레드에서 얻을 수 있습니다. 그러나 나는 비트 맵의 ​​효율적인 사용법에 관한 안드로이드의 공식 문서를 읽으라고 정말로 권합니다. 그들은 herehere입니다.

0

이미지에 사용 된 메모리 크기가 해당 이미지의 파일 크기와 완전히 다릅니다.

이미지가 다른 alghorithms (jpg, png 등)를 사용하여 압축 될 수 있고 메모리에 비트 맵으로로드 될 때 픽셀 당 2 또는 4 바이트를 사용합니다. 귀하의 경우 그래서

(코드를 파종하지 않습니다하지만 당신은 픽셀 당 4 바이트 사용하는 것처럼 lloks), 이미지 당 메모리 크기는 다음과 같습니다, 당신의 코드에서

size = width * height * 4; // this is aprox 2MB 

을 먼저 복사 원래 비트 맵을 새 비트 맵으로 변환 한 다음 배열을 색을 조작하도록 지정합니다. 총 이미지 수는 size x 3 = 6MB입니다.

가 안드로이드에서 큰 비트 맵을 처리하는 방법에 대한 예제가 많이 있습니다,하지만 난 가장 중요한 주제라고 생각 무엇을 떠날거야 :

  • 시도 코드에서 비트 맵의 ​​복사본 하나를 사용하는 위
  • 이미지에 단어가있는 경우에만 Bitmap.Config = RGB_565을 사용하십시오. 이 방법은 픽셀 당 2 바이트 만 사용하므로 크기가 절반으로 줄어 듭니다.
  • 더 이상 필요하지 않은 비트 맵에 recycle()을 호출하십시오.
  • 축척 옵션으로 lool을 Bitmap.Factory에 두십시오. 필요에 따라 이미지의 크기를 줄일 수도 있습니다.

행운을 빕니다.

관련 문제