基本原理
电脑中的图片,都是由像素点构成的,我们可以将图片理解为由像素组成的矩阵或二维数组,每个像素在矩阵中的位置,则表示了像素的位置信息。通常来说,一个像素点所包含A(透明度),R(红),G(绿),B(蓝)四个通道信息,在计算机中,R、G、B的取值范围为0~255,是1个Byte的大小,而int整型为4个Byte,正好可以储存一个像素点的四个通道信息,因此我们可以用1个int代表1个像素点。1个int中0-8位存B、8-16位存G、16-24位存R、24-32位存A。
//我们可以通过在JFrame中画出500*500的随机颜色像素点图,体会图片在计算机中的表示原理
@Override
public void paint(Graphics g) {
super.paint(g);
Random random = new Random();
random.nextInt(256);
int[][] imgdata = new int[500][500];
for (int i = 0; i < 500; i++) {
for (int j = 0; j < 500; j++) {
//将R、G、B信息塞进Color中再get出来就可用一个int表示
Color color =new Color(random.nextInt(256),random.nextInt(256),random.nextInt(256));
imgdata[i][j]= color.getRGB();
g.setColor(color);
g.drawLine(i, j, i, j);
}
}
}
显示原图
由于数组的纯粹性便于处理以及便于理解学习,考虑在获取图片时将BufferedImage转化为数组,以便在以后处理BufferedImage无法解决的问题
-
代码
- 获取图片
//读取一张图片,将其中颜色信息保存 public int[][] getImagePix(String pathName) { File file = new File(pathName); BufferedImage bufferedImage= null; try { bufferedImage = ImageIO.read(file); } catch (IOException e) { e.printStackTrace(); } int h = bufferedImage.getHeight(); int w = bufferedImage.getWidth(); int[][] imageData = new int[w][h]; for (int i = 0; i < imageData.length; i++) { for (int j = 0; j < imageData[i].length; j++) { imageData[i][j] = bufferedImage.getRGB(i, j); } } return imageData; }
- 显示图片
/* * 二维数组显示原图 */ public BufferedImage drawImage(Graphics g,int[][] imageData){ BufferedImage bi = new BufferedImage(imageData.length, imageData[0].length, BufferedImage.TYPE_INT_ARGB); for (int i = 0; i < imageData.length; i++) { for (int j = 0; j < imageData[i].length; j++) { bi.setRGB(i, j, imageData[i][j]); } } g.drawImage(bi,50,80,null); return bi; } /* * BufferedImage显示原图 */ public BufferedImage drawImage(Graphics g,BufferedImage bi){ g.drawImage(bi,50,80,null); return bi; }
-
效果
马赛克效果
马赛克的本质就是图片颜色的稀释,常见的马赛克就是将图片划分成包含多余一个像素点的无数个小矩形,将其中1个像素点的RGB信息作为小矩形中所有点的RGB信息
- 代码
/* * 马赛克 */ public BufferedImage drawImage01(Graphics g