画布:尝试绘制过大(144609280字节)的位图,在android.view.DisplayListCanvas.throwIfCannotDraw。

8

我从一个Web服务获取图片,然后按照以下步骤在imageView中显示它。

Picasso.with(getApplicationContext()).load(imageURL).fit().centerCrop().into(ivNews);

2天前,在服务器上上传了一张2048X1600分辨率的图片,突然应用程序开始崩溃,并出现以下异常信息:Canvas: trying to draw too large(144609280bytes) bitmap

有可能上传到服务器上的图片高于所述分辨率,并且服务器也可以在未来上传更高分辨率的图片。

我阅读了这篇文章,提到了glide在性能方面比picasso更快更好。

它也提到如果使用.fit().centerCrop(),则性能更好,但我已经在使用这些方法并出现了错误信息。

我想通过使用picasso来解决这个问题。


它会工作吗?Picasso.get().load(R.drawable.chat_image_placeholder).resize(1024, 800).onlyScaleDown().fit().centerCrop().into(thumbnailView) - AndyBoy
1个回答

22
你可以使用scaleDown()函数来缩小图片大小。下面是一个示例:
Picasso  
.with(context)
.load(<image_url>)
.resize(2048, 1600)
.onlyScaleDown() // the image will only be resized if it's bigger than 2048x 1600 pixels.
.into(<image_view>);

谢谢,所以在调整大小时使用较大的值会对性能更有利?但这将牺牲图像质量。是吗? - dev90
您可以选择某个分辨率的阈值限制。例如(1080x720),超过此分辨率的图像将被缩小。是的,缩小可能会扭曲您的图像。 - SripadRaj
1
你的回答听起来非常合理,但在2.5.2版本中实际行为是java.lang.IllegalStateException: onlyScaleDown can not be applied without resize。这对Picasso来说真是太遗憾了 :( - ericn
何时使用 fit() 和何时使用 resize()?您能否为我澄清一下? - AndyBoy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接