2011-09-09 21 views
9

Nếu tôi có SDK mục tiêu tối thiểu cho ứng dụng được đặt là 4 thì tất cả các cuộc gọi đến Drawable.createFromStream sẽ đổi kích thước hình ảnh.Làm thế nào để tạo một Drawable từ một dòng mà không thay đổi kích thước nó?

ví dụ: nếu hình ảnh nguồn rộng 480 và các thiết bị Android ứng dụng của tôi đang chạy trên có mật độ 1,5 sau đó đoạn mã sau trả về một BitmapDrawable có chiều rộng 320

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

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

Có một phương pháp để buộc nó phải thay đổi hoặc chỉ định tỷ lệ (ldpi/mdpi/hdpi etC) để trả về một hình ảnh từ một InputStream?

Chỉnh sửa: Giải pháp từ bên dưới.

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

Trả lời

8

Bạn có thể tải hình ảnh dưới dạng bitmap. Bằng cách này kích thước của nó sẽ không thay đổi.

BitmapFactory.decodeStream(...) 

Hoặc bạn có thể thử hàm xây dựng BitmapDrawable(InputStream is). Nó không được chấp nhận nhưng tôi đoán nó nên làm công việc.

+0

Tôi sẽ đi với phương thức 'BitmapDrawable()' khi nó đi thẳng đến điểm. Nó không được dùng nữa, nhưng không phải cho cấp API 4. Lý tưởng nhất là bạn sẽ sử dụng 'BitmapDrawable (Resource, InputStream)', nhưng điều đó không có sẵn cho bạn cho đến mức API 5. Một tùy chọn khác là thực hiện một cái gì đó như 'BitmapDrawable (Tài nguyên, bitmapFactory mới) .decodeStream (InputStream)) 'có sẵn ở cấp API 4 (nhưng không ít hơn). – DeeV

+0

Điều này hoạt động nhờ. Tôi đã thêm bản chỉnh sửa để hiển thị cách chuyển đổi thành BitmapDrawable. – Johnny

1

Sau một thời gian dài, tôi đã xem xét giải pháp sau đây. Nó hoạt động. Nó truy xuất tạo bitmap từ tập tin tại 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

tải hình ảnh từ nguồn địa phương trong ImageView Adaptor

tôi đã bị mắc kẹt với lỗi oom trong ion bởi Koushik Dutta, cho nhỏ nhất là 2 hình ảnh, tải từ thư mục tài nguyên. Thậm chí anh ta đã đề cập nó có thể xảy ra vì chúng không phải là luồng dữ liệu. và được đề xuất tải chúng dưới dạng InputStream.

Tôi đã tắt tiếng Thư viện vì tôi chỉ muốn 4 hình ảnh từ địa phương.

đây là giải pháp với ImageView đơn giản.

bên trong RecyclerViewAdapter/hoặc bất kỳ nơi

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); 

Mặc dù drawable d = new BitmapDrawable (b); không được chấp nhận nhưng, thực hiện công việc khá tốt.

nên thay vì chúng ta có thể trực tiếp lấy drawable từ InputStream chỉ bằng dòng này ..

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

Hy vọng nó giúp.

+0

tnx +1 phiếu bầu cho u. –

Các vấn đề liên quan