그림 자 체 를 조작 하 다.setImageBitmap,setImageResource,BitmapFactory.decodeResource 를 사용 하여 큰 그림 을 설정 하지 마 십시오.이 방법 들 은 decode 를 완성 한 후에 최종 적 으로 자바 층 의 createBitmap 를 통 해 이 루어 지기 때문에 더 많은 메모 리 를 소모 해 야 합 니 다.따라서 BitmapFactory.decodeStream 방법 을 통 해 bitmap 를 만 든 다음 ImageView 의 source 로 설정 합 니 다.decodeStream 의 가장 큰 비밀 은 JNI>nativeDecodeAsset()를 직접 호출 하여 decode 를 완성 하 는 것 입 니 다.자바 층 의 createBitmap 을 사용 하지 않 아 도 자바 층 의 공간 을 절약 할 수 있 습 니 다.읽 을 때 그림 의 Config 인 자 를 추가 하면 불 러 오 는 메모 리 를 더욱 효과적으로 줄 여 메모리 이상 을 막 을 수 있 습 니 다.또한 decodeStream 은 직접 그림 을 가지 고 바이트 코드 를 읽 습 니 다.기계 의 각종 해상도 에 따라 자동 으로 적응 하지 않 습 니 다.decodeStream 을 사용 한 후에 hdpi 와 mdpi,ldpi 에 해당 하 는 그림 자원 을 설정 해 야 합 니 다.그렇지 않 으 면 해상도 기계 에 똑 같은 크기(픽 셀 수량)로 표시 되 는 크기 가 맞지 않 습 니 다.
InputStreamis=this.getResources().openRawResource(R.drawable.pic1);
BitmapFactory.Optionsoptions=newBitmapFactory.Options();
options.inJustDecodeBounds=false;
options.inSampleSize=10;//width,hight
Bitmapbtp=BitmapFactory.decodeStream(is,null,options);
if(!bmp.isRecycle()){
bmp.recycle()//
system.gc()//
}
/**
*
*@paramcontext
*@paramresId
*@return
*/
publicstaticBitmapreadBitMap(Contextcontext,intresId){
BitmapFactory.Optionsopt=newBitmapFactory.Options();
opt.inPreferredConfig=Bitmap.Config.RGB_565;
opt.inPurgeable=true;
opt.inInputShareable=true;
//
InputStreamis=context.getResources().openRawResource(resId);
returnBitmapFactory.decodeStream(is,null,opt);
}
option 의 값 은 그림 을 크기 조정 하 는 비율 을 말 하 는데 SDK 에 서 는 그 값 이 2 의 지수 값 이 라 고 권장 하 며 값 이 클 수록 그림 이 선명 하지 않다.길이 와 너 비 는 모두 원래 그림 의 1/2 밖 에 없다.그림 크기 가 줄 어 들 면서 사용 하 는 메모리 도 자 연 스 럽 게 작 아 졌 다.이렇게 하 는 단점 은 그림 의 질 이 떨 어 지고 inSampleSize 의 가치 가 클 수록 그림 의 질 이 떨어진다 는 것 이다.각 휴대 전화 업 체 가 그림 을 크기 조정 하 는 알고리즘 이 다 르 기 때문에 휴대 전화 에 있 는 크기 조정 그림 의 질 이 다 를 수 있 습 니 다.필 자 는 moto 핸드폰 에 있 는 사진 크기 를 조정 한 후에 품질 이 받 아들 일 수 있 고 삼 성 핸드폰 에 있 는 똑 같은 크기 조정 비율 이지 만 품질 이 많이 떨 어 지 는 상황 을 겪 었 다.Android 에는 네 가지 가 있 는데 그것 이 바로 ALPHA 입 니 다.8:픽 셀 당 1byte 메모리 사용 ARGB4444:픽 셀 당 2byte 메모리 사용 ARGB8888:픽 셀 당 4byte 메모리 RGB565:픽 셀 당 2byte 메모리 사용 Android 기본 색상 모드 는 ARGB8888,이 색상 모드 는 색채 가 가장 섬세 하고 디 스 플레이 품질 이 가장 높 습 니 다.그러나 마찬가지 로 차지 하 는 메모리 도 가장 크다.이상 코드 는 1.png 를 ARGB 로4444 모드 읽 기.메모리 감 소 는 첫 번 째 방법 보다 뚜렷 하지 않 지만 대부분의 그림 에 대해 서 는 ARGB 와 보이 지 않 습 니 다.8888 모델 은 어떤 차이 가 있 습 니까?그러나 그 라 데 이 션 효과 가 있 는 그림 을 읽 을 때 색상 표시 줄 이 나타 날 수 있 습 니 다.또 그림 의 필터 처리 에 영향 을 줄 수 있다.Dalvik 가상 컴퓨터 의 메모리 분 배 를 최적화 합 니 다.안 드 로 이 드 플랫폼 의 경우 위탁 관리 층 이 사용 하 는 DalvikJavaVM 은 현재 의 표현 을 보면 최적화 처 리 를 할 수 있 는 곳 이 많다.예 를 들 어 우 리 는 대형 게임 이나 자원 을 소모 하 는 응용 프로그램 을 개발 할 때 GC 처리 에 수 동 으로 간섭 하 는 것 을 고려 할 수 있 고 dalvik.system.VMRuntime 류 가 제공 하 는 setTargetHeap Utilitization 방법 을 사용 하면 프로그램 메모리 의 처리 효율 을 강화 할 수 있다.사용 방법:
privatefinalstaticfloatTARGET_HEAP_UTILIZATION=0.75f;
VMRuntime.getRuntime().setTargetHeapUtilization(TARGET_HEAP_UTILIZATION);
이면 됩 니 다.그리고 메모리 의 크기 를 정의 할 수 있 습 니 다.4567913)그림 의 recycle()방법 을 호출 합 니 다.이것 은 사실 그림 의 메모 리 를 진정 으로 낮 추 는 방법 이 아 닙 니 다.주요 목적 은 이미지 대상 을 표시 하여 이미지 대상 의 로 컬 데 이 터 를 쉽게 회수 하 는 것 이다.그림 대상 의 로 컬 데이터 가 차지 하 는 메모리 가 가장 크 고 프로그램 자바 부분의 메모리 와 분리 하여 계산 합 니 다.그래서 자바 힙 은 충분히 사용 할 수 있 고 그림 은 OutOf Memory Error 가 발생 하 는 경우 가 많 습 니 다.그림 을 사용 하지 않 을 때 이 방법 을 사용 하면 그림 로 컬 데이터 의 피크 수 치 를 효과적으로 낮 추어 OutOf Memory Error 의 확률 을 줄 일 수 있 습 니 다.그러나 리 사이클()을 호출 한 그림 대상 이'폐기'상태 여서 호출 시 프로그램 오류 가 발생 할 수 있 습 니 다.따라서 이 그림 의 대상 이 절대 다시 호출 되 지 않 을 것 이 라 고 장담 할 수 없 는 상황 에서 이 방법 을 사용 하 는 것 을 권장 하지 않 습 니 다.특히 setImageBitmap(Bitmapimg)방법 으로 컨트롤 의 그림 대상 에 분 배 된 경우 시스템 라 이브 러 리 에 호출 되 어 프로그램 오류 가 발생 할 수 있 으 므 로 주의해 야 합 니 다.Matrix 대상 이 확대 한 그림 을 사용 하여 색상 모드 를 어떻게 바 꿉 니까?Matrix 대상 을 사용 하여 그림 을 확대 하면 반드시 더 많은 메모리 가 소모 되 지만 가끔 은 이렇게 해 야 합 니 다.확 대 된 그림 에 사용 되 는 ARGB8888 색상 모드,원본 사진 이 ARGB 라 고 해도4444 색상 모드 도 마찬가지 이 며 확대 할 때 색상 모드 를 직접 지정 할 수 없습니다.다음 방법 으로 그림 색상 모드 를 변경 할 수 있 습 니 다.코드 는 다음 과 같 습 니 다
privatefinalstaticintCWJ_HEAP_SIZE=6*1024*1024;VMRuntime.getRuntime().setMinimumHeapSize(CWJ_HEAP_SIZE);// heap 6MB
.그러나 시스템 은 img 1 을 자동 으로 회수 하기 때문에 실제 메모리 가 줄 어 들 었 다.