讀取網路圖片和本地sd卡圖片檔案 解析為空 SkImageDecoder::Factory returned null
阿新 • • 發佈:2019-02-17
1.sd卡讀取圖片解析返回null物件(圖片實際是存在的sd卡)
最近在使用BitmapFactory.decodeByteArray讀取本地圖片有時會發生讀取的圖片是null(聯想手機一些橫拍照片),儲存在本地後,通過位元組流讀取圖片檔案再轉換為圖片,可能會的報SkImageDecoder::Factory returned null的log日誌導致解析不成功返回null物件
解決方法:BitmapFactory.decodeFile(picfileString,opts)代替上面方法直接根據地址讀取轉換為圖片不再出現空!
2.網路讀取位元組流轉換圖片返回null物件(讀取的位元組流長度是有的)
錯誤方法:
BitmapFactory.decodeStream(conn.getInputStream());直接把網路資料流轉換成圖片(圖片大小有限制,大圖可能出現解析不成功返回為null)
BitmapFactory.decodeByteArray();把conn.getInputStream()轉換成位元組流作為引數傳入解析成圖片也可能會出現空
解決方法:把網路資料流轉換檔案,儲存在本地再通過BitmapFactory.decodeFile(picfileString,opts)讀取!
/ /把圖片存到本地 File file=new File(path); InputStream inputStream=conn.getInputStream(); FileOutputStream outputSteam=new FileOutputStream(file); byte[] buffer=new byte[2048]; int readbyte=0; while((readbyte=inputStream.read(buffer))!=-1) { outputSteam.write(buffer, 0, readbyte); } outputSteam.close(); inputStream.close(); //讀取圖片 BitmapFactory.Options opts = new BitmapFactory.Options(); int scale=1;//預設縮放比例,1代表不縮放 opts.inJustDecodeBounds = true ;//不獲取圖片,只是拿到圖片資訊 Bitmap bitmap=BitmapFactory.decodeFile(picPath opts); int w = opts.outWidth; int h = opts.outHeight; //計算長寬縮放比例(這裡120表示要顯示的長寬) double scalew=opts.outWidth/120.0; double scaleh=opts.outHeight/120.0; scale=(int)Math.sqrt(Double.valueOf((scalew*scalew+scaleh*scaleh))); if(scale==0) { scale=1; } else { //取2的倍數縮放 if(scale%2==0) { } else { scale=scale+1; } } opts.inJustDecodeBounds = false ;//確認縮放比例後開始準備載入合適的縮放比圖片 opts.inSampleSize = scale; opts.inPreferredConfig=Config.RGB_565; //bitmap=BitmapFactory.decodeByteArray(b, 0, b.length, opts); bitmap=BitmapFactory.decodeFile(MyUtils.getTempPic()+clipPicName, opts);