2015-09-14 27 views
5

Tôi muốn tải hình ảnh từ URL vào Bitmap bằng thư viện Picasso, nhưng hầu hết các ví dụ tôi tìm thấy là tải Bitmap vào ImageView hoặc một cái gì đó tương tự .Sử dụng Picasso để tải hình ảnh vào bitmap

Mã phải giống như thế này, theo tài liệu.

public void loadImage() { 

     Picasso.with(getBaseContext()).load("image url").into(new Target() { 

      @Override 
      public void onPrepareLoad(Drawable arg0) { 
      } 
      @Override 
      public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom arg1) { 
       Bitmap bitImage = Bitmap(getApplicationContext(),bitmap); 
      } 
      @Override 
      public void onBitmapFailed(Drawable arg0) { 
      } 
     }); 
    } 

Nhưng Bitmap bitImage = Bitmap(getApplicationContext(),bitmap); dường như không chính xác, vì tôi nhận được lỗi gọi phương thức.

Trả lời

2

Dường như bạn không tạo ra Bitmap đúng, nhưng nếu tôi ở vị trí của bạn tôi sẽ tạo ra một bitmap quy mô như vậy:

public Bitmap getResizedBitmap(Bitmap bm, int newWidth, int newHeight) { 
    int width = bm.getWidth(); 
    int height = bm.getHeight(); 
    float scaleWidth = ((float) newWidth)/width; 
    float scaleHeight = ((float) newHeight)/height; 
    // CREATE A MATRIX FOR THE MANIPULATION 
    Matrix matrix = new Matrix(); 
    // RESIZE THE BIT MAP 
    matrix.postScale(scaleWidth, scaleHeight); 

    // "RECREATE" THE NEW BITMAP 
    Bitmap resizedBitmap = Bitmap.createBitmap(
    bm, 0, 0, width, height, matrix, false); 
    bm.recycle(); 
    return resizedBitmap; 
} 

Sau đó đặt nó vào một IMAGExem như vậy:

mImg.setImageBitmap(img); 

nhìn chung nó sẽ trông như thế này:

public void loadImage() { 

    Picasso.with(getBaseContext()).load("image url").into(new Target() { 
      // .... 

      @Override 
      public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom arg1) { 
       // Pick arbitrary values for width and height 
       Bitmap resizedBitmap = getResizedBitmap(bitmap, newWidth, newHeight); 
       mImageView.setBitmap(resizedBitmap); 
      } 

      // .... 
     }); 
    } 
} 

public Bitmap getResizedBitmap(Bitmap bm, int newWidth, int newHeight) { 
    int width = bm.getWidth(); 
    int height = bm.getHeight(); 
    float scaleWidth = ((float) newWidth)/width; 
    float scaleHeight = ((float) newHeight)/height; 
    // CREATE A MATRIX FOR THE MANIPULATION 
    Matrix matrix = new Matrix(); 
    // RESIZE THE BIT MAP 
    matrix.postScale(scaleWidth, scaleHeight); 

    // "RECREATE" THE NEW BITMAP 
    Bitmap resizedBitmap = Bitmap.createBitmap(
    bm, 0, 0, width, height, matrix, false); 
    bm.recycle(); 
    return resizedBitmap; 
} 

Nhưng tôi hỏi bạn sử dụng Target hoàn toàn, thường là cho một trường hợp rất chuyên ngành. Bạn nên gọi singleton của Picasso trong cùng một lớp, bạn sẽ được hiển thị hình ảnh. Thông thường đây là trong một Adapter (RecyclerView Adaptor có thể) như sau:

Picasso.with(mContext) 
    .load("image url") 
    .into(mImageView); 
+0

Cảm ơn, tôi đã có phương pháp tại chỗ cho thay đổi kích thước (http://developer.android.com/training/displaying-bitmaps/load-bitmap .html). Tôi chỉ cần tải một hình ảnh từ một URL vào một Bitmap (không trực tiếp vào một ImageView), tìm ra từ các ý kiến ​​ở trên. Cảm ơn rất nhiều. – Alex

+0

Tại sao bạn sử dụng tác vụ không đồng bộ để tải hình ảnh. Bạn chỉ có thể thực hiện một cuộc gọi lại trong .into (mImageView, gọi lại mới <> {...}); – AndyRoid

+0

Trên thực tế, tôi đã cố gắng một cách nhanh chóng để tải một hình ảnh vào một bitmap mà sau đó sẽ được thực sự thông qua một Adapter (RecycleView), thay vì tải nó từ thư mục tài nguyên. Tôi đang cố gỡ lỗi một vấn đề được mô tả tại đây http://stackoverflow.com/questions/32554358/encountering-lag-when-updating-a-cardview-item-in-a-recycleview. Có lẽ tôi sẽ thử tải hình ảnh trong lớp nơi nó sẽ được hiển thị. Nhưng tôi mặc dù Picasso chỉ có thể được sử dụng trong một lớp học hoạt động, hoặc ít nhất đó là những gì tôi hiểu từ một số bài viết. Và tôi đoán tôi cần phải vượt qua bối cảnh đến lớp Adapter, phải không? – Alex

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