转换byte []到位图(android)

时间:2016-05-28 17:03:24

标签: java android asp.net bitmap retrofit2

我看到各种各样的人都遇到了这个问题。我使用retrofit 2.0.0 beta 2库。在我的Android应用程序中,我想要一张个人资料图片(所以我有动作上传新图像并查看个人资料(带图片)。 我的服务器是ASP.NET Web API。

我一直在阅读很多内容,到目前为止我能够上传图像(不确定是否正确,但似乎是)。当我试图从服务器获取图像以显示它时,我遇到了问题,我从服务器得到答案,但是当我尝试将字节数组转换为位图时,我得到了null结果。

这是我的代码,你可以查看一下:

android方面(改造方法)

@POST("UserProfile/Upload")
Call<ResponseBody> UpdateImage(@Body RequestBody file);

@GET("UserProfile/GetUserImage")
Call<ResponseBody> GetUserImage();

使用这些方法:

private void getProfilePic(){
    Call<ResponseBody> call = service.GetUserImage();
    call.enqueue(new CustomCallback<ResponseBody>(getActivity())
    {
        @Override
        public void onResponse(Response<ResponseBody> response, Retrofit retrofit)
        {
            if (response.isSuccess()) {
                if (response.body() != null) {
                    Bitmap bm = null;
                    try
                    {
                        bm = BitmapFactory.decodeStream(response.body().byteStream());
                    } catch (IOException e)
                    {
                        e.printStackTrace();
                    }
                    profilePic.setImageBitmap(bm);
                    dialog.dismiss();
                } else {
                    // TODO
                }
            } else {
                // TODO
            }
        }
        @Override
        public void onFailure(Throwable t)
        {
            super.onFailure(t);
        }
    });

public void onCropImageClick(View view) {
    Bitmap cropped =  mCropImageView.getCroppedImage(100, 100);
    if (cropped != null)
    {
        showLoadingDialog();
        ByteArrayOutputStream stream = new ByteArrayOutputStream();
        cropped.compress(Bitmap.CompressFormat.PNG, 100, stream);
        byte[] byteArray = stream.toByteArray();

        RequestBody requestBody = RequestBody
                .create(MediaType.parse("application/octet-stream"), byteArray);

        Call<ResponseBody> call = service.UpdateImage(requestBody);

        call.enqueue(new CustomCallback<ResponseBody>(this) {

            @Override
            public void onSuccess(ResponseBody model)
            {
                dialog.dismiss();
                finish();
            }

            @Override
            public void onFailure(Throwable t) {
                super.onFailure(t);
            }
        });
    }
}

web api服务器端:

    [Authorize]
    [Route("GetUserImage")]
    [HttpGet]
    public async Task<IHttpActionResult> GetUserImage()
    {
        string username = User.Identity.Name;
        Player player = await _service.FindPlayer(username);
        if (player == null)
            return BadRequest();
        return Ok(player.UserImage);
    }

    [Authorize]
    [HttpPost]
    [Route("Upload")]
    public async Task<IHttpActionResult> Upload([NakedBody]byte[] file)
    {
        return await _service.TryUpdateProfilePicture(file, User.Identity.Name) ? (IHttpActionResult)Ok() : BadRequest();
    }

    public async Task<bool> TryUpdateProfilePicture(byte[] file, string username)
    {
        try
        {
                var player = await FindPlayer(username);
                player.UserImage = file;
                _unitOfWork.Save();
                return true;
        }
        catch (DbEntityValidationException e)
        {
            return false;
        }
    }

我意识到:当我尝试将位图(byte [])发送到服务器时,它返回成功并存储在数据库中。当我尝试从服务器获取它时,我获得了成功响应,并且我有一些字节数组但是当我尝试将其转换为位图时,我得到了null对象。另外,正如我在下面的评论部分中所写,当我从服务器获取字节时,我得到的字节数比我发送给服务器的字节长,这可能很奇怪,但我不知道。

0 个答案:

没有答案