PNG图像有自己特殊的格式,而这个格式可以通过十六进制字节流很清楚地看出。
有关PNG格式的讲解我是参考这位老师的:http://www.cnblogs.com/lidabo/p/3701197.html
将图片转为十六进制字节数组的代码是参考这位老师的:http://blog.youkuaiyun.com/evangel_z/article/details/7453402
为了能更直观地比较,我稍做了些改动。代码如下:
<span style="font-size:14px;">package png;
import java.io.FileInputStream;
/**
* 图片转成十六进制
*/
public class PngBytes {
public static void main(String[] args) throws Exception {
try {
FileInputStream fis = new FileInputStream("image/1.png");
java.io.ByteArrayOutputStream bos = new java.io.ByteArrayOutputStream();
byte[] buff = new byte[1024];
int len = 0;
while ((len = fis.read(buff)) != -1)
{
bos.write(buff, 0, len);
}
// 得到图片的字节数组
byte[] result = bos.toByteArray();
System.out.println("图片的字节数组:\n" + byte2HexStr(result));
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
/*
* 实现字节数组向十六进制的转换方法一
*/
public static String byte2HexStr(byte[] b)
{
System.out.print("b.length:"+b.length+"\n");
String hs = "";
String stmp = "";
for (int n = 0; n < b.length; n++)
{
stmp = (Integer.toHexString(b[n] & 0XFF));
if (stmp.length() == 1) {
hs = hs + "0" + stmp;
}else{
hs = hs + stmp;
}
hs+=' ';
if(n!=0 && (n+1)%16==0){
hs+='\n';
}
}
return hs.toUpperCase();
}
}
</span>
之前新建了一个8*8的PNG图像用来测试,其在Ultra Edit中打开的效果如下:
java项目的控制台效果如下:
- b.length:2799
- 图片的字节数组:
- 89 50 4E 47 0D 0A 1A 0A 00 00 00 0D 49 48 44 52
- 00 00 00 08 00 00 00 08 08 06 00 00 00 C4 0F BE
- 8B 00 00 00 09 70 48 59 73 00 00 0E C3 00 00 0E
- C3 01 C7 6F A8 64 00 00 0A 4D 69 43 43 50 50 68
- 6F 74 6F 73 68 6F 70 20 49 43 43 20 70 72 6F 66
- 69 6C 65 00 00 78 DA 9D 53 77 58 93 F7 16 3E DF
- F7 65 0F 56 42 D8 F0 B1 97 6C 81 00 22 23 AC 08
- C8 10 59 A2 10 92 00 61 84 10 12 40 C5 85 88 0A
- 56 14 15 11 9C 48 55 C4 82 D5 0A 48 9D 88 E2 A0
- 28 B8 67 41 8A 88 5A 8B 55 5C 38 EE 1F DC A7 B5
- 7D 7A EF ED ED FB D7 FB BC E7 9C E7 FC CE 79 CF
- 0F 80 11 12 26 91 E6 A2 6A 00 39 52 85 3C 3A D8
- 1F 8F 4F 48 C4 C9 BD 80 02 15 48 E0 04 20 10 E6