주간 인기 게시물

총 게시물 39,242건, 최근 0 건 안내 RSS 글쓰기
이전글  다음글  목록 글쓰기
[안드로이드]

카메라에서 찍은 사진을 저장할때 out of memory 에러가 납니다

글쓴이 : sinwho 날짜 : 2019-01-13 (일) 22:24 조회 : 519
글주소 : http://www.androidside.com/B49/170552
 
  카메라 배우기 에어클래스
동영상강의, 초보자도 쉽게 따라할 수 있는 기초부터 중고급까지, 실생활활용 노하우
www.airklass.com
  카메라사진 라이프톡!
사진으로 돈벌기? 초보회원 3일만에 1,700만원 수익! 카메라사진 제공!
www.lifetalk.kr
  그림의 모든것 그림닷컴
명화, 팝아트, 2만5천여그림, 카메라사진, 드라마협찬, 최대50%할인
www.gurim.com
신청하기


특정폰에서(구형폰)에서 카메라에서 찍은 사진을 저장할때 에러가 나네요

Throwing OutOfMemoryError "Failed to allocate a 51916812 byte allocation with 12763771 free bytes and 12MB until OOM"

이미지 파일이 커서 그런거 같은데 largeHeap="true" 으로 일단 해결은 했는데

제대로 된 해결책은 아닌거 같아서요

그리고 제 앱에서 저장하면 이미지 사진이 6M인데 폰의 기본 앱으로 찍으면 2M정도가 나오네요

참고로 해상도는 최고 해상도로 찍을려고 하고 제 앱과 폰의 기본 카메라 앱도 해상도는 같습니다

혹시 방법 있을까요?

Bitmap.createBitmap 에서 에러가 나고 이 부분을 빼버리면(회전을 안하고 저장을 하면)

에러가 없습니다 하지만 저는 저장할때 회전을 하고 싶은데 가능할까요?

소스는 아래와 같습니다 감사합니다^^

private class SaveImageTask extends AsyncTask<byte[], Void, Void> {


    @Override
    protected void onPreExecute() {
        super.onPreExecute();

    }

    @Override
    protected Void doInBackground(byte[]... data) {

        BitmapFactory.Options options = new BitmapFactory.Options();
        options.inPreferredConfig = Bitmap.Config.ARGB_8888;
        Bitmap bitmap = BitmapFactory.decodeByteArray(data[0], 0, data[0].length, options);

        Log.i("sinwhod","matrix = " + orientation);


        Matrix matrix = new Matrix();
        //matrix.postRotate(orientation);
        matrix.setRotate(orientation);
        bitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);

        ByteArrayOutputStream stream = new ByteArrayOutputStream();
        bitmap.compress(Bitmap.CompressFormat.JPEG, 100, stream);
        byte[] currentData = stream.toByteArray();

        Date day = new Date();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.getDefault());
        fileName = String.valueOf(sdf.format(day));

        savePath = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).toString();

        temp = savePath + "/" + fileName + ".jpg";

        File file = new File(temp);
        try {
            FileOutputStream fos = new FileOutputStream(file);
            fos.write(currentData);
            fos.flush();
            fos.close();
        } catch (Exception e) {
            Log.i("sinwhod", "error = " + e);

        }


        sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.parse("file://" + temp)));


        return null;
    }

    @Override
    protected void onPostExecute(Void aVoid) {
        super.onPostExecute(aVoid);

        Toast.makeText(MainActivity.this, temp, Toast.LENGTH_SHORT).show();

    }
}





질문자가 자신의 포인트 10 점을 걸었습니다.
답변하시면 포인트 2을, 답변이 채택되면 포인트 8을 드립니다.

질문답변 게시판에서 궁금한 사항을 해결하셨다면, 애써 답변해주신 분께 잘 되었다고 따뜻한 댓글 한마디 남겨주세요.
그리고 답변해주신 분의 글을 '추천' 해주세요.
추천받으신 분에게 1포인트가, 추천하신 분에게도 1포인트가 적립됩니다. ^^

뉴키 2019-01-14 (월) 17:08
 bitmap.compress(Bitmap.CompressFormat.JPEG, 100, stream);

100을 줄이세요.

두번째 질문은 뭘 원하시는지 이해를 못하겠네요.
댓글주소 추천 0 반대 0
이전글  다음글  목록 글쓰기

 


Copyright ⓒ www.androidside.com. All rights reserved.
채팅 권한: 글쓰기 1개
2레벨 이상만 대화 가능
공개 채팅: 평일 !(9시 ~ 17시),토,일
안사2 변경사항 보러가기 챗방이 잘 안보이면 크롬에서 접속해주세요
챗방 숨기기 |  챗방 보이기