為了給自己的網站加入圖像識別,引入了百度大腦的api,但是需要將網絡圖片轉換成base64的編碼格式。在網上找的程序一般是這樣的
public static String getImageStrFromUrl(String imgURL) {
byte[] data = null;
try {
// 創建URL
URL url = new URL(imgURL);
// 創建鏈接
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
conn.setConnectTimeout(5 * 1000);
InputStream inStream = conn.getInputStream();
data = new byte[inStream.available()];
inStream.read(data);
inStream.close();
} catch (IOException e) {
e.printStackTrace();
}
// 對字節數組Base64編碼
BASE64Encoder encoder = new BASE64Encoder();
// 返回Base64編碼過的字節數組字符串
return encoder.encode(data);
}
但是經過反復測試,結果和本地圖片(同一張)生成的base64編碼差距很大,少了一半以上的字節,查詢了相關資料,
返回此輸入流下一個方法調用可以不受阻塞地從此輸入流讀取(或跳過)的估計字節數。下一個調用可能是同一個線程,也可能是另一個線程。一次讀取或跳過此估計數個字節不會受阻塞,但讀取或跳過的字節數可能小于該數。
最終的解決辦法
/**
* 根據地址獲得數據的字節流
* @param strUrl 網絡連接地址
* @return
*/
public static byte[] getImageFromNetByUrl(String strUrl){
try {
URL url = new URL(strUrl);
HttpURLConnection conn = (HttpURLConnection)url.openConnection();
conn.setRequestMethod("GET");
conn.setConnectTimeout(5 * 1000);
InputStream inStream = conn.getInputStream();//通過輸入流獲取圖片數據
byte[] btImg = readInputStream(inStream);//得到圖片的二進制數據
return btImg;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* 從輸入流中獲取數據
* @param inStream 輸入流
* @return
* @throws Exception
*/
public static byte[] readInputStream(InputStream inStream) throws Exception{
ByteArrayOutputStream outStream = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len = 0;
while( (len=inStream.read(buffer)) != -1 ){
outStream.write(buffer, 0, len);
}
inStream.close();
return outStream.toByteArray();
}