2011-09-09 2 views
9

내 앱의 최소 대상 SDK가 4로 설정된 경우 Drawable.createFromStream에 대한 모든 호출은 이미지 크기를 조정합니다.크기를 조정하지 않고 스트림에서 Drawable을 만드는 방법은 무엇입니까?

소스 이미지가 480 픽셀 폭과 내 응용 프로그램이 실행되고있는 안드로이드 디바이스는 1.5의 밀도가있는 경우 다음 코드는 변경으로 강제 할 수있는 방법이 있나요 (320)

URL url = new URL("http://www.examples.com/something.png"); 

Drawable d = Drawable.createFromStream(url.openStream(), "something.png"); 

의 폭으로 BitmapDrawable을 반환 또는 InputStream에서 이미지를 리턴 할 스케일 (ldpi/mdpi/hdpi etC)을 지정 하시겠습니까?

아래에서 편집하십시오.

Bitmap b = BitmapFactory.decodeStream(inputStream); 
b.setDensity(Bitmap.DENSITY_NONE); 
Drawable d = new BitmapDrawable(b); 

답변

8

당신은 비트 맵으로 이미지를로드 할 수 있습니다. 이렇게하면 크기가 변경되지 않습니다.

BitmapFactory.decodeStream(...) 

또는 당신은 BitmapDrawable(InputStream is) 생성자를 시도 할 수 있습니다. 그것은 더 이상 사용되지 않지만 작업을 수행해야합니다.

+0

'BitmapDrawable()'메서드를 사용하면 곧바로 포인트로갑니다. API 레벨 4에서는 사용되지 않습니다. BitmapDrawable (Resource, InputStream)을 사용하는 것이 가장 이상적이지만 API 레벨 5까지는 사용할 수 없습니다. 또 다른 옵션은 'BitmapDrawable (Resource, new BitmapFactory() .decodeStream (InputStream))'API 레벨 4에서 사용할 수 있습니다 (그 이하는 아닙니다). – DeeV

+0

감사합니다. BitmapDrawable로 변환하는 방법을 보여주는 편집을 추가했습니다. – Johnny

1

오랜 시간이 지난 후에 다음 해결책을 찾았습니다. 그것은 작동합니다. Locallink에서 파일로부터 비트 맵을 생성합니다. 이미지 뷰 어댑터 로컬 리소스에서

private Drawable getDrawableForStore(String localLink) { 
    Bitmap thumbnail = null; 
    try { 
     File filePath = this.getFileStreamPath(localLink); 
     FileInputStream fi = new FileInputStream(filePath); 
     thumbnail = BitmapFactory.decodeStream(fi); 
    } catch (Exception ex) { 
     Log.e("getThumbnail() on internal storage", ex.getMessage()); 
     return null; 
    } 

    DisplayMetrics metrics = new DisplayMetrics(); 
    getWindowManager().getDefaultDisplay().getMetrics(metrics); 
    float scaledDensity = metrics.density; 
    int width = thumbnail.getWidth(); 
    int height = thumbnail.getHeight(); 

    if(scaledDensity<1){ 

     width = (int) (width *scaledDensity); 
     height = (int) (height *scaledDensity); 
    }else{ 
     width = (int) (width +width *(scaledDensity-1)); 
     height = (int) (height +height *(scaledDensity-1)); 
    } 

    thumbnail = Bitmap.createScaledBitmap(thumbnail, width, height, true); 
    Drawable d = new BitmapDrawable(getResources(),thumbnail); 

    return d; 

} 
1

로딩 이미지

I 리소스 폴더로드 낮은 2와 이미지, 코식 두타 의해 이온의 OOM 오류 고집 하였다. 심지어 그는 데이터 스트림이 아니기 때문에 발생할 수도 있다고 언급했습니다. 그들을 InputStream으로로드하도록 제안했다.

로컬에서 4 개의 이미지 만 원했기 때문에 이온 라이브러리를 고정 시켰습니다.

간단한 ImageView가있는 솔루션입니다.

RecyclerViewAdapter 내부

/또는 여기서

InputStream inputStream = mContext.getResources().openRawResource(R.drawable.your_id); 

    Bitmap b = BitmapFactory.decodeStream(inputStream); 
    b.setDensity(Bitmap.DENSITY_NONE); 
    Drawable d = new BitmapDrawable(b); 
    holder.mImageView.setImageDrawable(d); 

비록 그리기 D = 새로운 BitmapDrawable (b);은 더 이상 사용되지 않지만 작업은 상당히 잘됩니다.

그래서 대신에 우리는 바로 .. 그냥이 선으로 InputStream로부터 당김을 얻을 수

Drawable d = Drawable.createFromStream(inputStream,"src"); 

는 도움이되기를 바랍니다.

+0

tnx +1 투표하십시오. –

관련 문제