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);