2017-10-15 40 views
0

在我的应用程序中,我使用picasso下载图像并将该图像转换为字节数组。我在下方调用此方法下载并将图像转换为字节数组。Android - 位图空对象引用

private byte[] convertToByte(String url) { 

    Picasso.with(list_my_posts.this).load(url).fit().centerCrop().into(img); 
    Bitmap bitmap=((BitmapDrawable)img.getDrawable()).getBitmap(); 
    ByteArrayOutputStream stream=new ByteArrayOutputStream(); 
    bitmap.compress(Bitmap.CompressFormat.PNG,100,stream); 
    byteArray= stream.toByteArray(); 

    Toast.makeText(getApplicationContext(),"Downloaded Successfully",Toast.LENGTH_LONG).show(); 

    return byteArray; 
} 

我的问题是我收到这样的错误。
登录

java.lang.NullPointerException: Attempt to invoke virtual method 'android.graphics.Bitmap android.graphics.drawable.BitmapDrawable.getBitmap()' on a null object reference 

谁能帮我解决这个问题。

+0

可能重复[什么是NullPointerException,以及如何解决它?](https://stackoverflow.com/questions/218384/what-is-a-nullpointerexception-and-how-doi-i-fix -it) – user1506104

+0

毕加索操作是异步的。当您尝试在下一行中检索图像时,图像将不会被加载到“ImageView”中。 –

+0

@MikeM。请任何代码片段。 –

回答

1

您不需要ImageView仅用于下载图像并获取其字节数组。使用Picasso,您可以注册下载完成后调用的回调。

private Target target = new Target() { 
    @Override 
    public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) { 
    } 

    @Override 
    public void onBitmapFailed(Drawable errorDrawable) { 
    } 

    @Override 
    public void onPrepareLoad(Drawable placeHolderDrawable) { 
    } 
} 

使用此回调,您可以异步下载图片:

Picasso.with(context).load(url).into(target); 

另外一个位图转换为字节数组,可以先压缩位图,然后将其保存到输出流:

ByteArrayOutputStream stream = new ByteArrayOutputStream(); 
bmp.compress(Bitmap.CompressFormat.PNG, 100, stream); 
byte[] byteArray = stream.toByteArray(); 

如果您不想压缩,可以使用Bitmap.copyPixelsToBuffer方法。

+0

@Frogatto非常感谢你,它的工作很好。 –

+0

@Rajkumar我很高兴能为您提供帮助。如果您的问题已解决,请考虑我的答案[_accepting_](https://stackoverflow.com/help/someone-answers)。不仅是这篇文章,你的所有文章。请接受你的问题的最佳答案。这就是Stack Overflow用户应该这样做的。 –