Java 使用BufferedImage快速画出图片
在上一篇文章中我们学习了类似相机中的一些功能,比如黑白、马赛克等,但是我们发现一个问题,画的太慢了,一张图片能画半天,而且还是一条一条的。今天我们来学习如何迅速的画出图片。
新知识:new BufferedImage(图片的宽,高,颜色类型),g,drawImage(img,偏置x,偏置y,null)
我们可以使用图片缓冲区BufferedImage
来暂存我们要画出的图片,最后通过画笔Graphics对象的drawImage()方法
直接绘制,即可迅速画出图片。
下面我们来和上次的代码对比这看有哪些不同。
上次的画原图代码(慢):
/**
* 原图
* @param imgArr
* @param g
*/
public void drawImage(int[][] imgArr, Graphics g){
for (int i = 0; i < imgArr.length; i++) {
for (int j = 0; j < imgArr[i].length; j++) {
int pixnum = imgArr[i][j];//获取当前像素颜色,用int值表示
Color color = new Color(pixnum);
g.setColor(color);
X Y 为预先定义好的偏置值,设定图像的位置
g.fillRect(X + i, Y + j, 1, 1);//采用矩形绘制,原图像素点也是1*1的矩形,因此不会有任何缝隙
}
}
}
快速画原图代码:
public void DrawImage(Graphics g, int[][] imgArray){
// 提升绘制的速度
// 先创建一个空的BufferedImage width height ARGB
BufferedImage buffimg = new BufferedImage (
imgArray.length,imgArray[0].length,
BufferedImage.TYPE_INT_ARGB);//RGB类型
for (int i = 0; i < imgArray.length; i++) {
for (int j = 0; j < imgArray[i].length; j++) {
int pixnum = imgArray[i][j];
// 将像素值存入buffimg,这样就在缓冲区中存入了像素
buffimg.setRGB(i, j, pixnum);
}
}
// 循环结束之后 将buffimg 绘制出来
g.drawImage (buffimg,0,0,null);
}
代码并没有差多少,只是我们从之前的每次获取像素就画变成了像素全部存储完后再画,效率自然高了不少