近期一个项目,客户需要从.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服务器路径