之前写了图片的构成与图片重绘,接下来说说如何将图片转化为可以储存的数据。
数组
之前说的像素点的储存与重绘是有二维数组来完成的,同理,将任意图片储存也要将其转化为二维数组储存进计算机。
讲到二维数组,就简单介绍一下我所理解的二维数组。学过线性代数的小伙伴一个就知道二维数组是以矩阵或类似矩阵的形式存在的,如下就是一个4x4的二维矩阵。
0,0,0,0 0,0,0,0 0,0,0,0
在计算机中储存的二维数组也是以这样的方式储存的吗?显然不是。如果二维是矩阵,那三维、四位等又该怎么储存?实际上,计算机的内存条的线性结构就决定了数据的储存也必然线性的。一维数组很好理解
int[] arg=new int[] {0,0,0,0,0,0,0};
一维整型数组里面每一个元素都是一个整形数。那么二维、三维甚至是更高维又该如何理解?二维数组有两个[ ],如下,可以先把[ ]与前面的数组名放一起暂时当一个数组名 arg[ ] ,然后数组名+[ ]也就是上面所说的一维数组了,不过这个“一维数组”中的每个素都是一维数组!可以理解就是多个一维数组构成的二维数组。同理,三维数组的数组名与前两个[ ] 组成一个特殊的一维数组,这个一维数组里面的元素是二维数组,这个二维数组中的元素又是一维数组,也就可理解为三维数组的元素是二维数组,二维数组里面有是一维数组。有点像俄罗斯套娃的意味。更高维的数组同样如此。
int[][] arg=new int[][] {{},{}};
简单展示一下一维数组和二维数组
int[] arg1=new int[] {0,0,0,0};
int[][] arg2=new int[][] {{0,0,0,0},{0,0,0,0,}};
理解了二维数组了,该讲正事了。
将图片转化为二维数组
图片其实是由像素矩阵组成的,我们需要把这些像素转换为二维数组。所以我们需要一个存储图片信息的东西。这里我们就要用文件。
先创建一个文件对象,这里要用到java.io这个包下的 File 类。括号里的path我们写上图片文件的路径。然后需要用到BufferedImage这个类,这是Java中专门处理缓存图片的类。读取图片我们用到ImageIO.read();这个方法。这里可能会产生IO异常,所以我们加上try catch的语句。接着我们根据图片对象进行初始化二维数组,然后根据图片对象进行初始化二维数组。
整个流程就是先把图片转成BufferedImage,然后再转成二维数组。
这样我们就可以绘制一张图片啦!
int[][] imageData=convertImageToArray("TP/hhw.jpg");
public static int[][] convertImageToArray(String fileName) {
// 先创建文件对象 :
File file = new File(fileName);
// 声明一个BUfferedImage的引用名
BufferedImage bf =null;
try {
// 将文件对象读为 缓冲图片对象
bf = ImageIO.read(file);
} catch (IOException e) {
e.printStackTrace();
}
// 根据图片对象进行初始化二维数组
int w = bf.getWidth ();
int h = bf.getHeight ();
int[][] imgData = new int[w][h];
// 将 buffimg 中的RGB值存入数组中
for(int i = 0; i < w; i++){
for(int j = 0; j < h; j++){
imgData[i][j] = bf.getRGB(i,j);
}
}
//返回数组
return imgData;
}
转化为二维数组就可以来进行图片的一些处理,不仅仅原图绘制,一些基础特效也是可以完成的
上图的这些基础操作都是可以完成的,详情请看下回——图形的重绘与特效。



