生活随笔
收集整理的這篇文章主要介紹了
java解析bmp文件
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
最近想做一個圖片查看器,因為bmp的圖片簡單些,也就從這個入手。
? ? ? ? ?運用的基本知識還是IO的,關鍵是在于對于“協議”的理解。
? ? ? ? ?一直覺得這些個協議是個很帥氣的東西。感覺就像密碼一樣,你讀到了一個文件,你只有知道對方的“加密”方式,你才能正確的解讀,否則你拿著也沒用。就像你無法用記事本正確地打開一張圖片一樣,里面只會全是亂碼。
? ? ? ? 言歸正傳,根據以上的說法,我們首先應該去了解的是BMP文件時如何寫的。
? ? ? ? BMP文件分為四個部分:文件頭信息塊,圖像描述信息塊,顏色表,圖像信息區。
?
? ? ? ? 文件頭信息塊
? ? ? ? 這個部分主要是一些基本的信息,比如,開頭兩個字節最終讀出來是BM,是標識BMP文件的,所以如果以后想要讀多種文件分類,可以用開頭的標識來分類。
? ? ? ? 因為此部分的信息后面讀取圖片意義不大,所以直接讀出來,跳過。
? ? ? ??
Java代碼 ?
???int?bflen=14;??byte?bf[]=new?byte[bflen];??dis.read(bf);?? //讀取前面14個字節int bflen=14;byte bf[]=new byte[bflen];dis.read(bf);
?
? ? ? ?圖像描述信息塊
? ? ? ?此部分包含圖像的一些基本信息,包括圖像大小,寬,高,壓縮方式等等。
? ? ? ?寬高是一個非常重要的數據,因此在此我們要獲取到寬和高。
? ? ? ?
Java代碼 ?
??int?bilen=40;??byte?bi[]=new?byte[bilen];??dis.read(bi,0,bilen);??image_width=ChangeInt(bi,7);??image_height=ChangeInt(bi,11);?? //讀取后面40個字節,并且獲取到圖像的寬和高int bilen=40;byte bi[]=new byte[bilen];dis.read(bi,0,bilen);image_width=ChangeInt(bi,7);image_height=ChangeInt(bi,11);
? ? ? ?
Java代碼 ?
?????????????public?int?ChangeInt(byte[]?bi,int?end){??????return(((int)bi[end]&0xff)<<24)??????|(((int)bi[end-1]&0xff)<<16)??????|(((int)bi[end-2]&0xff)<<8)??????|(int)bi[end-3]&0xff;??}?? /*** byte轉變為int數據的方法* @param bi傳入的數組* @param end四個byte型數的最后的一個* @return*/public int ChangeInt(byte[] bi,int end){return(((int)bi[end]&0xff)<<24)|(((int)bi[end-1]&0xff)<<16)|(((int)bi[end-2]&0xff)<<8)|(int)bi[end-3]&0xff;}
? ? ? ? ?顏色表
? ? ? ? ?此區域大小由顏色模式而定,在后面讀取中基本不怎么用到,所以在此就不詳解了。
? ? ? ? 圖像數據區
? ? ? ??BMP格式的圖像分為2色圖,16色圖,256色圖以及真彩圖。
? ? ? ? 除了真彩色以外,其它三種形式均要用00補齊行字節數,使之成為4的整數倍。
? ? ? ? 也因此,我們在處理圖像的時候,要注意這個問題,跳過是用來補齊4的整數倍的數據。
? ? ? ??
Java代碼 ?
??????public?void?showRGB24(DataInputStream?dis){??????if(!(image_width*3%4==0)){??????????skip_width=4-image_width*3%4;??????}????????????imageG=new?int[image_height][image_width];??????imageB=new?int[image_height][image_width];??????imageR=new?int[image_height][image_width];????????????for(int?h=image_height-1;h>=0;h--){??????????for(int?w=0;w<image_width;w++){??????????????try?{??????????????????int?blue=?dis.read();??????????????????int?green=dis.read();??????????????????int?red=dis.read();????????????????????????????????????imageB[h][w]=blue;??????????????????imageG[h][w]=green;??????????????????imageR[h][w]=red;????????????????}?catch?(IOException?e)?{??????????????????e.printStackTrace();??????????????????System.exit(0);??????????????}????????????????????????????if(w==0){??????????????????try?{??????????????????????System.out.println(dis.skipBytes(skip_width));??????????????????}?catch?(IOException?e)?{??????????????????????e.printStackTrace();????????????????????????????????????????}??????????????}?????????????????????????}??????}?????????}?? /*** 顯示顏色的方法* 對顏色的處理* @param dis數據流*/public void showRGB24(DataInputStream dis){if(!(image_width*3%4==0)){skip_width=4-image_width*3%4;}//申請數組空間imageG=new int[image_height][image_width];imageB=new int[image_height][image_width];imageR=new int[image_height][image_width];for(int h=image_height-1;h>=0;h--){for(int w=0;w<image_width;w++){try {int blue= dis.read();int green=dis.read();int red=dis.read();imageB[h][w]=blue;imageG[h][w]=green;imageR[h][w]=red;} catch (IOException e) {e.printStackTrace();System.exit(0);}if(w==0){try {System.out.println(dis.skipBytes(skip_width));} catch (IOException e) {e.printStackTrace();}} }} }
? ? ? ?存儲好顏色之后,后面再重繪出圖片就OK 啦。
?
一點小結:
包括后面要做的通信項目,個人覺得關鍵仍然是協議。不是一種看看就可以的狀態,要深入去了解,包括一些特殊的情況。透過現象看本質吧~
轉載于:https://www.cnblogs.com/java20130722/p/3206902.html
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎
總結
以上是生活随笔為你收集整理的java解析bmp文件的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。