BitmapFactory.decodeByteArray() 返回null,分析与解决

时间:2022-04-14 03:48:01

问题描述:用android自带的Camera获取图片,上传至远程数据库中(mysql),以BLOB格式存储,

但在提取图片时,始终无法在android界面显示,示例代码如下:

.....  ....

s = new Socket("192.168.0.68", 9999);
   din = new DataInputStream(s.getInputStream());

...   ...

int size = din.readInt();//读取服务器端传来的图片数据
   byte[] bs = new byte[size];
   din.read(bs);

Bitmap b = BitmapFactory.decodeByteArray(bs,0,bs.length);

Log.i("kkk00",String.valueOf(b));//输出测试,bitmap始终为NUll

解决方法:

方法1:增加转码处理

int size = din.readInt();//读取服务器端传来的图片数据
   byte[] bs = new byte[size];
   din.read(bs);

YuvImage yuvimage=new YuvImage(bs, ImageFormat.NV21, 20,20, null);//20、20分别是图的宽度与高度
       ByteArrayOutputStream baos = new ByteArrayOutputStream();
       yuvimage.compressToJpeg(new Rect(0, 0,20, 20), 80, baos);//80--JPG图片的质量[0-100],100最高
       byte[] jdata = baos.toByteArray();

Bitmap bmp = BitmapFactory.decodeByteArray(jdata, 0, jdata.length);

测试:bmp不为空,放入控件中可正常显示。

方法2:当图片以二进制形式传至服务器端时,将其存储到本机上,在以文件流的形式存入mysql数据库中

.......

int size = din.readInt();//读取图片数组的长度
     FileOutputStream fos = new FileOutputStream("c:/bbbb1.bmp"); 
     int len=0;
     byte[] mm=new byte[1024];
     while(true) {
      int m=din.read(mm);
      len=len+m;
      fos.write(mm,0,m);
      if(len>=size) break; 
     }
     fos.close();

//在读取文件写入mysql

..... ...

File file = new File("c:/bbbb1.bmp");  
     int length = (int) file.length();   
    InputStream fin = new FileInputStream(file); 
    pstmt.setBinaryStream (9, fin, length);