从Picasso加载的ImageView获取位图

我有一个加载图像的方法,如果图像尚未加载之前,它会在服务器上查找它。 然后将其存储在应用程序文件系统中。 如果它在文件系统中,则它会加载该映像,因为这比从服务器上拖出映像要快得多。 如果你之前没有closures应用程序就加载了图像,它将被存储在一个静态字典中,这样它可以重新加载而不用占用更多的内存,以避免内存不足错误。

这一切工作正常,直到我开始使用毕加索图像加载库。 现在我正在将图像加载到ImageView中,但是我不知道如何获取返回的位图,以便将其存储在文件或静态字典中。 这使事情变得更加困难。 因为这意味着每次尝试从服务器加载映像,这是我不想发生的事情。 是否有一种方法可以将它加载到ImageView后的位图? 以下是我的代码:

public Drawable loadImageFromWebOperations(String url, final String imagePath, ImageView theView, Picasso picasso) { try { if (Global.couponBitmaps.get(imagePath) != null) { scaledHeight = Global.couponBitmaps.get(imagePath).getHeight(); return new BitmapDrawable(getResources(), Global.couponBitmaps.get(imagePath)); } File f = new File(getBaseContext().getFilesDir().getPath() .toString() + "/" + imagePath + ".png"); if (f.exists()) { picasso.load(f).into(theView); **This line below was my attempt at retrieving the bitmap however it threw a null pointer exception, I assume this is because it takes a while for Picasso to add the image to the ImageView** Bitmap bitmap = ((BitmapDrawable)theView.getDrawable()).getBitmap(); Global.couponBitmaps.put(imagePath, bitmap); return null; } else { picasso.load(url).into(theView); return null; } } catch (OutOfMemoryError e) { Log.d("Error", "Out of Memory Exception"); e.printStackTrace(); return getResources().getDrawable(R.drawable.default1); } catch (NullPointerException e) { Log.d("Error", "Null Pointer Exception"); e.printStackTrace(); return getResources().getDrawable(R.drawable.default1); } } 

任何帮助将不胜感激,谢谢!

Solutions Collecting From Web of "从Picasso加载的ImageView获取位图"

使用毕加索,您不需要实现自己的静态字典,因为它是为您自动完成的。 @intrepidkarthi是正确的,因为图像在第一次被加载时被毕加索自动caching,所以它不会经常调用服务器来获取相同的图像。

这就是说,我发现自己处于类似的情况:我需要访问下载的位图,以便将其存储在我的应用程序的其他位置。 为此,我调整了@Gilad Haimov的回答:

  Picasso.with(this) .load(url) .into(new Target() { @Override public void onBitmapLoaded (final Bitmap bitmap, Picasso.LoadedFrom from) { /* Save the bitmap or do something with it here */ //Set it in the ImageView theView.setImageBitmap(bitmap); } @Override public void onPrepareLoad(Drawable placeHolderDrawable) {} @Override public void onBitmapFailed(Drawable errorDrawable) {} }); 

这使您可以访问加载的位图,同时仍然asynchronous加载它。 您只需要记住将其设置在ImageView中,因为它不再为您自动完成。

请注意,如果您有兴趣了解您的图片来自哪里,则可以使用相同的方法访问该信息。 上述方法的第二个参数是Picasso.LoadedFrom from ,它是一个枚举,可以让你知道位图是从哪个源加载的(三个源是DISKMEMORYNETWORK 。通过使用这里解释的debugging指示器来查看位图的加载位置的可视方式。

希望这可以帮助 !

毕加索让你直接控制下载的图像。 要将下载的图像保存到文件中,请执行以下操作:

 Picasso.with(this) .load(currentUrl) .into(saveFileTarget); 

哪里:

 saveFileTarget = new Target() { @Override public void onBitmapLoaded (final Bitmap bitmap, Picasso.LoadedFrom from){ new Thread(new Runnable() { @Override public void run() { File file = new File(Environment.getExternalStorageDirectory().getPath() + "/" + FILEPATH); try { file.createNewFile(); FileOutputStream ostream = new FileOutputStream(file); bitmap.compress(CompressFormat.JPEG, 75, ostream); ostream.close(); } catch (Exception e) { e.printStackTrace(); } } }).start(); } } 

既然你在使用毕加索,你可能还想充分利用它。 它包含一个强大的caching机制。

Picasso实例上使用picasso.setDebugging(true)来查看发生了哪种caching(图像是从磁盘,内存或networking加载的)。 请参阅: http : //square.github.io/picasso/ (debugging指标)

Picasso的默认实例configuration为( http://square.github.io/picasso/javadoc/com/squareup/picasso/Picasso.html#with-android.content.Context-

LRU内存caching的15%是可用的应用程序RAM

2%存储空间的磁盘caching高达50MB但不低于5MB。 (注意:这只适用于API 14+,或者如果您正在使用独立库,在OkHttp等所有API级别上提供磁盘caching)

您还可以使用Picasso.Builder指定您的Cache实例Picasso.Builder定义您的实例,并且可以指定您的Downloader进行更好的控制。 (在Picasso中有一个OkDownloader的实现,如果你在你的应用中包含OkHttp ,它会自动使用。

在这个例子中,我用来设置一个colapsing工具栏的背景。

 public class MainActivity extends AppCompatActivity { CollapsingToolbarLayout colapsingToolbar; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); colapsingToolbar = (CollapsingToolbarLayout) findViewById(R.id.colapsingToolbar); ImageView imageView = new ImageView(this); String url ="www.yourimageurl.com" Picasso.with(this) .load(url) .resize(80, 80) .centerCrop() .into(image); colapsingToolbar.setBackground(imageView.getDrawable()); } 

我希望这对你有所帮助。

用这个

 Picasso.with(context) .load(url) .into(imageView new Callback() { @Override public void onSuccess() { //use your bitmap or something } @Override public void onError() { } }); 

希望它能帮助你