1. 程式人生 > >讀取網路圖片和本地sd卡圖片檔案 解析為空 SkImageDecoder::Factory returned null

讀取網路圖片和本地sd卡圖片檔案 解析為空 SkImageDecoder::Factory returned null

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