2010-06-01 4 views
2

BitmapFactory.decodeFile을 사용하여 이미지의 비트 맵을 내 애플리케이션에로드하고 있습니다. 그러나이 함수는 큰 이미지 (예 : 카메라의 이미지)에 null을 반환합니다. 파일 경로가 확실히 정확합니다. 왜 null을 반환하는지 알 수 없습니다. supersampling을 시도했지만 도움이되지 않았습니다.Android에서 카메라 이미지를 비트 맵으로로드

왜이 작업을 수행 할 것인지 또는 카메라에서 가져온 이미지를 비트 맵에로드하는 방법을 쉽게 알 수 있습니까? 당신은 당신이 사용하는 코드의 조각 같은 문제에 대한 자세한 정보를 제공해야합니다

public static Bitmap loadBitmap(String filePath){ 
    Bitmap result = BitmapFactory.decodeFile(filePath); 

    if(result == null){ 
     if(filePath.contains(".jpg") || filePath.contains(".png")){ 
      //This is the error that occurs when I attempt to load an image from the Camera DCIM folder or a large png I imported from my computer. 
      Utils.Toast("Could not load file -- too big?"); 
     } else { 
      Utils.Toast("Could not load file -- image file type is not supported"); 
     } 
    } 
    return result; 
} 
+0

SDCard에 카메라 이미지를 저장합니까? 경로의 모든 디렉토리가 존재합니까? –

+0

예, 이미지가 파일 브라우저를 통해 선택되므로 경로가 정확할 것입니다. 같은 폴더에서 선택한 다른 (더 작은) 이미지는 완벽하게 작동합니다. – GuyNoir

+0

사용중인 코드를 제공해주십시오. – Cristian

답변

3

:

여기 내가 사용하고 코드입니다. 예를 들어 http://casidiablo.in/BitmapFactory

파일을 열리는 동안 문제가 있다면 BitmapFactory.decodeFile는 null을 반환됩니다 이유 중 하나 : 당신이 BitmapFactory.decodeFile 메소드는 null를 돌려 왜 때/알고 싶은 경우에, 당신은 직접 소스 코드를 읽을 수 있습니다 . 흥미롭게도, 개발자는 그러한 문제로 어떤 것도 기록하지 않습니다 ... 주석을 보면 "아무 것도하지 않습니다. 예외가 열려 있으면 bm이 null이됩니다."

public static Bitmap decodeFile(String pathName, Options opts) { 
    Bitmap bm = null; 
    InputStream stream = null; 
    try { 
     stream = new FileInputStream(pathName); 
     bm = decodeStream(stream, null, opts); 
    } catch (Exception e) { 
     /* do nothing. 
      If the exception happened on open, bm will be null. 
     */ 
    } finally { 
     if (stream != null) { 
      try { 
       stream.close(); 
      } catch (IOException e) { 
       // do nothing here 
      } 
     } 
    } 
    return bm; 
} 

당신이 볼 수 있듯이BitmapFactory.decodeFile는 독립적으로 작동하지 않습니다 ...하지만 (예, BitmapFactory.decodeStream, BitmapFactory.nativeDecodeStream, BitmapFactory.finishDecode을 위해 등)을 BitmapFactory 클래스의 몇 가지 다른 방법을 사용합니다. 문제는 그러한 방법 중 하나 일 수 있습니다. 따라서 제가 당신 인 경우, 어떻게 작동하는지 읽고 이해하려고 노력할 것입니다. 그래서 어떤 경우에 null을 반환하는지 알 수 있습니다.

+0

방금 ​​회신을 입력하는 동안 코드를 게시했습니다. 당신이 제안한 것과 같은 몇 가지 방법을 살펴 보겠습니다. 감사! – GuyNoir

+0

음, 괜찮 았어, 그냥 FileInputStream 메서드를 대신 시도하고 실제로 파일이 존재하지 않는다고 않습니다. 거기에 파일이 있다고 생각하면 아주 이상합니다. 계속 부탁드립니다. – GuyNoir

+1

좋아, 파일 이름이 문제 인 것 같습니다. 사진의 타임 스탬프를 기반으로하는 이름 대신 "image.jpg"로 이름을 바꿀 때 실제로 이미지를로드 할 수 있습니다. 도와 주셔서 감사합니다. 물론 지금 OOM 예외가 발생하지만 처리해야 할 부분이 있습니다. Gallery 응용 프로그램의 소스를 찾을 수있는 곳이 어디인지 알 수 있습니까? 큰 이미지를로드하고 표시 할 때 작은 힙 크기 문제를 어떻게 해결할 수 있는지 알아야합니다. – GuyNoir

0

분명히 들리지만 파일 경로가 실제로 파일을 가리키는 지 확인하십시오. 파일 관리자를 사용하여 이미지를 선택하면 파일 관리자가 파일 대신 경로를 파일 제공자에게 반환 할 수 있습니다.

전달하는 경로의 종류를 미리 알 필요없이 ContentResolver 클래스를 사용하여 파일을 여는 더 강력한 방법이 있습니다.이 클래스는 콘텐츠 공급자, 파일 또는 리소스에 대한 InputStream을 열 수 있습니다.

유일한 단점은 문자열 대신 openInputStream() 호출시 Uri 객체를 전달해야한다는 것입니다.

public static Bitmap loadBitmap(String filePath, Context c) { 
    InputStream inStream; 

    try { 
     inStream = c.getContentResolver().openInputStream(Uri.parse(filePath)); 
    } catch (FileNotFoundException e) { 
     // handle file not found 
    } 

    return BitmapFactory.decodeStream(inStream); 
} 

이는 setImageURI 메소드를 사용할 때 ImageView 위젯이 이미지를로드하는 방법이기도합니다.

관련 문제