网站服务器时间在哪里查询,用网站模板做网站,车险代理平台,灰色关键词排名收录最近想做一个图片查看器#xff0c;因为bmp的图片简单些#xff0c;也就从这个入手。 运用的基本知识还是IO的#xff0c;关键是在于对于“协议”的理解。 一直觉得这些个协议是个很帅气的东西。感觉就像密码一样#xff0c;你读到了一个文件#xff0c;你只有知道对方的“…最近想做一个图片查看器因为bmp的图片简单些也就从这个入手。 运用的基本知识还是IO的关键是在于对于“协议”的理解。 一直觉得这些个协议是个很帅气的东西。感觉就像密码一样你读到了一个文件你只有知道对方的“加密”方式你才能正确的解读否则你拿着也没用。就像你无法用记事本正确地打开一张图片一样里面只会全是乱码。 言归正传根据以上的说法我们首先应该去了解的是BMP文件时如何写的。 BMP文件分为四个部分文件头信息块图像描述信息块颜色表图像信息区。 文件头信息块 这个部分主要是一些基本的信息比如开头两个字节最终读出来是BM是标识BMP文件的所以如果以后想要读多种文件分类可以用开头的标识来分类。 因为此部分的信息后面读取图片意义不大所以直接读出来跳过。 Java代码 //读取前面14个字节 int bflen14; byte bf[]new byte[bflen]; dis.read(bf); //读取前面14个字节int bflen14;byte bf[]new byte[bflen];dis.read(bf); 图像描述信息块 此部分包含图像的一些基本信息包括图像大小宽高压缩方式等等。 宽高是一个非常重要的数据因此在此我们要获取到宽和高。 Java代码 //读取后面40个字节并且获取到图像的宽和高 int bilen40; byte bi[]new byte[bilen]; dis.read(bi,0,bilen); image_widthChangeInt(bi,7); image_heightChangeInt(bi,11); //读取后面40个字节并且获取到图像的宽和高int bilen40;byte bi[]new byte[bilen];dis.read(bi,0,bilen);image_widthChangeInt(bi,7);image_heightChangeInt(bi,11); Java代码 /** * 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; } /*** 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代码 /** * 显示颜色的方法 * 对颜色的处理 * param dis数据流 */ public void showRGB24(DataInputStream dis){ if(!(image_width*3%40)){ skip_width4-image_width*3%4; } //申请数组空间 imageGnew int[image_height][image_width]; imageBnew int[image_height][image_width]; imageRnew int[image_height][image_width]; for(int himage_height-1;h0;h--){ for(int w0;wimage_width;w){ try { int blue dis.read(); int greendis.read(); int reddis.read(); imageB[h][w]blue; imageG[h][w]green; imageR[h][w]red; } catch (IOException e) { e.printStackTrace(); System.exit(0); } if(w0){ try { System.out.println(dis.skipBytes(skip_width)); } catch (IOException e) { e.printStackTrace(); } } } } } /*** 显示颜色的方法* 对颜色的处理* param dis数据流*/public void showRGB24(DataInputStream dis){if(!(image_width*3%40)){skip_width4-image_width*3%4;}//申请数组空间imageGnew int[image_height][image_width];imageBnew int[image_height][image_width];imageRnew int[image_height][image_width];for(int himage_height-1;h0;h--){for(int w0;wimage_width;w){try {int blue dis.read();int greendis.read();int reddis.read();imageB[h][w]blue;imageG[h][w]green;imageR[h][w]red;} catch (IOException e) {e.printStackTrace();System.exit(0);}if(w0){try {System.out.println(dis.skipBytes(skip_width));} catch (IOException e) {e.printStackTrace();}} }} } 存储好颜色之后后面再重绘出图片就OK 啦。 一点小结 包括后面要做的通信项目个人觉得关键仍然是协议。不是一种看看就可以的状态要深入去了解包括一些特殊的情况。透过现象看本质吧~转载于:https://www.cnblogs.com/java20130722/p/3206902.html