JAVA图片与字节流的相互转换
hi~我是鄭突突
今天我們學習:java圖片與字節流的相互轉換。
場景:用戶端上傳一個圖片,圖片轉換成字節流,字節流使用Base64編碼,然后服務端收到Base64編碼后的字符串,然后轉換成圖片,最終實現圖片的傳輸。
為什么要使用Base64?
我們知道在計算機中任何數據都是按ascii碼存儲的,而ascii碼的128~255之間的值是不可見字符。
而在網絡上交換數據時,比如說從A地傳到B地,往往要經過多個路由設備,
由于不同的設備對字符的處理方式有一些不同,這樣那些不可見字符就有可能被處理錯誤,這是不利于傳輸的。
所以就先把數據先做一個Base64編碼,統統變成可見字符,這樣出錯的可能性就大降低了。
ASCII 碼使用指定的7 位或8 位二進制數組合來表示128 或256 種可能的字符。標準ASCII 碼也叫基礎ASCII碼,使用7 位二進制數(剩下的1位二進制為0)來表示所有的大寫和小寫字母,數字0 到9、標點符號, 以及在美式英語中使用的特殊控制字符。后128個稱為擴展ASCII碼。許多基于x86的系統都支持使用擴展(或“高”)ASCII。擴展ASCII 碼允許將每個字符的第8 位用于確定附加的128 個特殊符號字符、外來語字母和圖形符號。我們的數據傳輸基本上使用ascil碼傳輸。
圖片轉換成字節流,保存的是每個像素點的rgb值?基數是256,但我們的數據傳輸,比如說255 就是11111111,就會顯示128 個特殊符號字符、外來語字母和圖形符號。就是亂碼。
Base64的實現原理:實現原理
首先將圖片轉換成字節流
static byte[] image2Bytes(String imgSrc) throws Exception {FileInputStream fin = new FileInputStream(new File(imgSrc));//可能溢出,簡單起見就不考慮太多,如果太大就要另外想辦法,比如一次傳入固定長度byte[]byte[] bytes = new byte[fin.available()];//將文件內容寫入字節數組,提供測試的casefin.read(bytes);fin.close();return bytes;}byte[] b1 = image2Bytes(path+"\\Jordan.jpg"); //path是絕對路徑 byte[] b1 = image2Bytes(path+"\\Jordan.jpg"); //path是絕對路徑System.out.println(new String(b1));System.out.println("b1=" + Arrays.toString(b1));為什么會有負數?
因為涉及到補碼,比如說255,就是1111111,然后啥啥啥的,反正就變成了復數,這里的負數就是128以后的ascil碼值了,就是“亂碼”。
字節流的Base64編碼和解碼
byte[] b1 = image2Bytes(path+"\\Jordan.jpg"); //path是絕對路徑System.out.println(new String(b1));System.out.println("*圖片的字節數組 = " + Arrays.toString(b1));byte[] b2 = Base64.getEncoder().encode(b1);System.out.println("編碼后的字節數組 = "+Arrays.toString(b2));System.out.println("編碼后的字節數組對應的ascil碼值 = "+new String(b2));byte[] b3 = Base64.getDecoder().decode(b2);System.out.println("解碼后的字節數組 = "+Arrays.toString(b3));
還有更多的基于Base64編碼的不同方法,有基于url的,基于http的。
讀者可以自行去搜索。
完成了圖像的傳遞!!
總結
以上是生活随笔為你收集整理的JAVA图片与字节流的相互转换的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python-urllib3
- 下一篇: GhostNet网络详解