BitmapFactory.decodeResource는 Android 2.2에서 변경 가능한 비트 맵을 반환하고 Android 1.6에서 변경 불가능한 비트 맵을 반환합니다.

부자 :

Android 2.2를 실행하는 내 기기에서 애플리케이션을 개발하고 테스트 중입니다. 내 코드에서 BitmapFactory.decodeResource를 사용하여 검색 한 Bitmap을 사용 bitmap.setPixels()하고이를 호출 하여 변경할 수 있습니다. 나는 안드로이드 1.6를 실행하는 친구의 디바이스에서이를 테스트 할 때, 나는 얻을 IllegalStateException에 대한 호출에 bitmap.setPixels. 온라인 설명서에 따르면 IllegalStateException비트 맵이 변경 불가능한 경우이 메서드에서이 발생합니다. 문서는 decodeResource불변 비트 맵을 반환하는 것에 대해 아무것도 말하지 않지만 분명히 그럴 것입니다.

두 번째 Bitmap객체 를 필요로하지 않고 응용 프로그램 리소스에서 변경 가능한 비트 맵을 안정적으로 가져 오기 위해 다른 호출을 수행 할 수 있습니까 (동일한 크기 의 변경 가능한 비트 맵을 만들고이를 래핑하는 Canvas에 그릴 수 있지만 동일한 크기의 비트 맵 두 개가 필요함) 내가 의도했던 것보다 두 배 더 많은 메모리를 사용)?

Derzu :

변경 불가능한 비트 맵을 변경 가능한 비트 맵으로 변환 할 수 있습니다.

하나의 비트 맵의 ​​메모리 만 사용하는 수용 가능한 솔루션을 찾았습니다.

소스 비트 맵은 디스크 (램 메모리 없음)에 원시 저장 (RandomAccessFile) 된 다음 소스 비트 맵이 해제되고 (이제 메모리에 비트 맵이 없음) 그 후에 파일 정보가 다른 비트 맵에로드됩니다. 이렇게하면 시간당 램 메모리에 하나의 비트 맵 만 저장되어있는 비트 맵 복사본을 만들 수 있습니다.

여기에서 전체 솔루션 및 구현보기 : Android : 변경 불가능한 비트 맵을 변경 가능으로 변환

이제 모든 유형의 비트 맵 (ARGB_8888, RGB_565 등)에서 작동하는이 솔루션에 개선 사항을 추가하고 임시 파일을 삭제합니다. 내 방법을 참조하십시오.

/**
 * Converts a immutable bitmap to a mutable bitmap. This operation doesn't allocates
 * more memory that there is already allocated.
 * 
 * @param imgIn - Source image. It will be released, and should not be used more
 * @return a copy of imgIn, but muttable.
 */
public static Bitmap convertToMutable(Bitmap imgIn) {
    try {
        //this is the file going to use temporally to save the bytes. 
        // This file will not be a image, it will store the raw image data.
        File file = new File(Environment.getExternalStorageDirectory() + File.separator + "temp.tmp");

        //Open an RandomAccessFile
        //Make sure you have added uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"
        //into AndroidManifest.xml file
        RandomAccessFile randomAccessFile = new RandomAccessFile(file, "rw");

        // get the width and height of the source bitmap.
        int width = imgIn.getWidth();
        int height = imgIn.getHeight();
        Config type = imgIn.getConfig();

        //Copy the byte to the file
        //Assume source bitmap loaded using options.inPreferredConfig = Config.ARGB_8888;
        FileChannel channel = randomAccessFile.getChannel();
        MappedByteBuffer map = channel.map(MapMode.READ_WRITE, 0, imgIn.getRowBytes()*height);
        imgIn.copyPixelsToBuffer(map);
        //recycle the source bitmap, this will be no longer used.
        imgIn.recycle();
        System.gc();// try to force the bytes from the imgIn to be released

        //Create a new bitmap to load the bitmap again. Probably the memory will be available. 
        imgIn = Bitmap.createBitmap(width, height, type);
        map.position(0);
        //load it back from temporary 
        imgIn.copyPixelsFromBuffer(map);
        //close the temporary file and channel , then delete that also
        channel.close();
        randomAccessFile.close();

        // delete the temp file
        file.delete();

    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } 

    return imgIn;
}

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

TOP 리스트

  1. 1

    어떻게 아무리 "나쁜", ANY의 SSL 인증서와 HttpClient를 사용하지합니다

  2. 2

    SAP Java Connector (SAP JCO) SAP Funcion Module의 동적 매개 변수 및 값 목록

  3. 3

    자바, 레디 스, 탄성 검색, 몽고와 자동 완성

  4. 4

    ElasticSearch-노드 잠금을 가져 오지 못했습니다.

  5. 5

    Excel : 합계가 N보다 크거나 같은 상위 값 찾기

  6. 6

    rclone으로 원격 디렉토리의 모든 파일을 삭제하는 방법은 무엇입니까?

  7. 7

    Ubuntu는 GUI에서 암호로 사용자를 만듭니다.

  8. 8

    R-이중 항목 피벗 테이블 만들기

  9. 9

    PyCharm에서 갑자기 일부 메뉴 명령이 작동을 멈췄습니다.

  10. 10

    Cassandra에서 버전이 지정된 계층의 효율적인 모델링

  11. 11

    자바의 .txt 파일에서 2D 배열 읽기

  12. 12

    매개 변수에서 쿼리 객체를 선언하는 방법은 무엇입니까?

  13. 13

    cypress로 배열의 인덱스를 가져 오면 대신 "-1"이 반환됩니다.

  14. 14

    VBA-조건에 따라 자동으로 팝업되는 오류 메시지를 가질 수 있습니까?

  15. 15

    여러 양식을 사용하여 목록 상자 내에서 데이터 편집 문제

  16. 16

    jfreecharts에서 x 및 y 축 선을 조정하는 방법

  17. 17

    스크립트에 의해 SSH를 통해 자동으로 X 프로세스 전달

  18. 18

    그룹 별 중복 관측치를 축소하면서 테이블 전치

  19. 19

    마우스 휠 JQuery 이벤트 핸들러에 대한 방향 가져 오기

  20. 20

    버튼을 클릭하기 위해 pywinauto를 가져올 수 없습니다.

  21. 21

    randomUUID ()를 사용하여 생성 된 UUID의 길이를 줄이는 방법

뜨겁다태그

보관