Android 从Web服务器数据库中获取二进制图片数据,显示在ImageView控件中

近期一个项目,客户需要从.net IIS服务器的Selserver数据库中获取图片二进制字段值,显示在APP的ImageView中,此功能实现如下:

一、在IIS服务器端创建一个ashx格式的一般处理程序,用于将数据库中的图片二进制数据转换成JSON格式的string字符串。

代码如下:

Get_HuLinYan_Photo.ashx

    /// <summary>
    /// Get_HuLinYan_Photo 的摘要说明
    /// </summary>
    public class Get_HuLinYan_Photo : IHttpHandler
    {

        public void ProcessRequest(HttpContext context)
        {
            context.Response.ContentType = "text/plain";
            DataTable dt = HLY_services.getHuLinYuanPhoto(context.Request["DeviceIMEI"], context.Request["SimNumber"]);
            //将UserInfo列表转换成Json字符串
            string JsonString = JsonConvert.SerializeObject(dt, new DataTableConverter());
            context.Response.Write(JsonString);
        }

        public bool IsReusable
        {
            get
            {
                return false;
            }
        }
    }

接收到的数据如下:

[{"Photo":"/9j/4AAQSkZJRgABAQEAYABgAAD/4QBaRXhpZgAATU0AKgAAAAgABQMBAAUAAAABAAAASgMDAAEAAAABAAAAAFEQAAEAAAABAQAAAFERAAQAAAABAAAOw1ESAAQAAAABAAAOwwAAAAAAAYagAACxj//bAEMAIBYYHBgUIBwaHCQiICYwUDQwLCwwYkZKOlB0Znp4cmZwboCQuJyAiK6KbnCg2qKuvsTO0M58muLy4MjwuMrOxv/bAEMBIiQkMCowXjQ0XsaEcITGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxv/AABEIAogCBgMBIgACEQEDEQH/xAAfAAABBQEBAQEBAQAAAAAAAAAAAQIDBAUGBwgJCgv/xAC1EAACAQMDAgQDBQUEBAAAAX0BAgMABBEFEiExQQYTUWEHInEUMoGRoQgjQrHBFVLR8CQzYnKCCQoWFxgZGiUmJygpKjQ1Njc4OTpDREVwT1qWNC46c0oXJ9TSdBx196XOR6VJQ4KKv2q/use9UFHOSa0LT/VfjUs0Ww+QYVj7VQToa0ZP9W30rOXpUPc2pbMyjTTTm6mm11IxZXPU/U0lOb77fWm0EhRRRQAUlFFABRRRQIWikpaYC0UUUAFFFFABRRRQAUUUUASPTAeaKKQEsb7TmtmxvlEQQ5PPGKKKALRuX7RkfU4qCa7kT+7n25oopJAZl3cNPjLZx2qmWNFFMBuc1esolT94/X+EUUUITLpm+tN81j0AooqXJiE3se9JyfU0UUrsBKUAY5oopAKAB0AFGfaiikAbh6Ck3Z6HmiimAhNNLHniiigQvNHOaKKAAKO5pSQOufxNFFAAW45pAecAH8RRRQAYbPb8qdj/IoooAUAUc46UUUAJmjJI6UUUALx7008DqKKKBibs9vyo570UUAJjJGKXHGCDRRQAqqKeFHaiikA8fQVes/wDV/jRRUmq2JX/1TfQ1nxqT27UUVEjWm9GZLdTTTRRXUjJkD/fPvTaKKCQooooASiiigAooooEFLRRTAKWiigAooooAKSiigBaKKKAP/9k="}]

数据只显示一个Photo字段值,这也是要在Android中用到的数据

二、在安卓端创建一个函数,用于将上述接收到的JSON数据转换为可用的string字符串

private String _photoimage;      //图片字符串
private void parseJSONWithJSONObject(String jsonData){

        try {
            JSONArray jsonArray = new JSONArray(jsonData);
            for(int i=0;i<jsonArray.length();i++){
                JSONObject jsonObject = jsonArray.getJSONObject(i);
                _photoimage = jsonObject.getString("Photo");  //Photo为数据库中存放图片数据的字段名
            }
        } catch (JSONException e) {

        }

}

创建一个从服务器获取图片数据的线程,代码如下:

private void getHuLinYuanPhoto(){
        new Thread(new Runnable(){
            @Override
            public void run(){
                try{
                    OkHttpClient client = new OkHttpClient();  //创建OkHttpClient请求
                    Request request = new Request.Builder()
                            .url(HttpUtils.PATH+"ashx/get_HuLinYuan_Photo.ashx?DeviceIMEI=862679031682063&SimNumber=123456")  //url为从服务器获取数据的ashx一般程序网址,根据自己情况设定
                            .build();
                    Response response = client.newCall(request).execute();
                    String responseData = response.body().string();  //获取到页面数据
                    parseJSONWithJSONObject(responseData);    //将页面数据转换成可用的image字符串数据
                    //System.out.println("查询到的数据库图片字段数据==" + _photoimage);
                    Bitmap photo_bitmap = BaseFunctions.stringToBitmap(_photoimage);    //将字符串数据转变成bitmap数据
                    //System.out.println("转换后的bitmap 是"+photo_bitmap);

                    if(photo_bitmap == null){  //如果图片字段无数据,则显示默认图标
                        //首先将图片转换成bitmap,然后将bitmap转换成String
                        Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.log);
                        String bitmapString = BaseFunctions.bitmapToString(bitmap);
                        //将String转换成Bitmap之后,通过setImageBitmap将图片显示出来
                        photo_bitmap = BaseFunctions.stringToBitmap(bitmapString);
                    }
                    Message msg = new Message();  //发布Message
                    msg.what = 0;
                    msg.obj = photo_bitmap;
                    handle.sendMessage(msg);

                }catch(Exception e){
                    e.printStackTrace();
                }
            }
        }).start();
    }

    //创建Handler,更新页面布局,将图片显示在imageview控件中
    private Handler handle = new Handler(Looper.myLooper()) {
        public void handleMessage(Message msg) {
            switch (msg.what) {
                case 0:
                    Bitmap bmp=(Bitmap)msg.obj;
                    image.setImageBitmap(bmp);
                    break;
            }
        };
    };

用到的两个函数如下:

     /**
     * Base64字符串转换成图片
     *
     * @param string
     * @return
     */
    public static Bitmap stringToBitmap(String string) {
        Bitmap bitmap = null;
        try {
            byte[] bitmapArray = Base64.decode(string, Base64.DEFAULT);
            bitmap = BitmapFactory.decodeByteArray(bitmapArray, 0, bitmapArray.length);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return bitmap;
    }

    /**
     * 图片转换成base64字符串
     *
     * @param bitmap
     * @return
     */
    public static String bitmapToString(Bitmap bitmap) {
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        bitmap.compress(Bitmap.CompressFormat.PNG, 100, baos);
        byte[] imgBytes = baos.toByteArray();// 转为byte数组
        return Base64.encodeToString(imgBytes, Base64.DEFAULT);
    }


public static String PATH="http://192.168.1.196/";   //web服务器路径

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jackiesky1206

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值