图像的表示
在计算机中,图像的显示是通过像素点来实现的,每个像素点可以说是一个小小的矩形,该矩形里面填充了一定的颜色。而图像就是将这些填充了颜色的矩形排列组合从而在计算机中显示出来的。
因此,在计算机中要表达一张图片,那么只需要知道每个像素点的位置及其填充的颜色即可。所以对于图像的储存,我们可以用一个二维数组表示,其下标表示像素点的位置,存储的内容为该像素点对应的颜色。
图像的绘制
首先我们要取得图片的数据并用一个二维数组表示,首先我们创建一个File类对象指向图片文件,简单的读取文件我们可以用ImageIO.read来实现,其返回值是一个BufferedImage类对象,所以我们创建相应对象来存放相应内容,相应操作如下:
File image = new File(FilePath);
BufferedImage buffImage = null;
try {
buffImage = ImageIO.read(image);
} catch (IOException e) {
e.printStackTrace();
}
其中文件路径可能错误或其他情况ImageIO.read可能会报异常,抛出异常即可。
BufferedImage类对象可以调用方法getRGB(int,int)获取对应像素点的RGB颜色值,其返回值是一个int类型数据,再通过BUufferedImage类的getWidth与getHight可以定义一个int类型的二维数组来储存图像内容。我们将其建成一个方法,具体实现如下:
public static int[][] getImage(String Path){
File image = new File(Path);
BufferedImage buffImage = null;
try {
buffImage = ImageIO.read(image);
} catch (IOException e) {
e.printStackTrace();
}
int[][] imageArr = new int[buffImage.getWidth()][buffImage.getHeight()];
for (int i=0;i<buffImage.getWidth();i++){
for (int j=0;j<buffImage.getHeight();j++){
imageArr[i][j] = buffImage.getRGB(i,j);
}
}
return imageArr;
}
取得了图像数据我们就能画出图像,我们先建立一个显示图像的窗口,然后循环画出每个像素点,像素点的绘制用Graphics类中的fillRect矩形填充方法即可。具体实现如下:
public class TextImage {
public static void main(String[] args) {
// 建立窗体
JFrame imageFrame = new JFrame();
imageFrame.setSize(new Dimension(700,700));
imageFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
imageFrame.setLocationRelativeTo(null);
imageFrame.setVisible(true);
Graphics g = imageFrame.getGraphics(); // 获取画笔
int[][] image = getImage("菜狗.jpg"); // 获取图像数据
// 循环绘制图像
for (int i=0;i<image.length;i++){
for (int j=0;j<image[i].length;j++){
g.setColor(new Color(image[i][j]));
g.fillRect(100+i,100+j,1,1);
}
}
}
public static int[][] getImage(String Path){
File image = new File(Path);
BufferedImage buffImage = null;
try {
buffImage = ImageIO.read(image);
} catch (IOException e) {
e.printStackTrace();
}
int[][] imageArr = new int[buffImage.getWidth()][buffImage.getHeight()];
for (int i=0;i<buffImage.getWidth();i++){
for (int j=0;j<buffImage.getHeight();j++){
imageArr[i][j] = buffImage.getRGB(i,j);
}
}
return imageArr;
}
}
这样即可画出图像
滤镜的实现就是通过对颜色的处理来实现的,例如令RGB三种颜色值相等所绘出的颜色是灰色,我们可以取其平均值然后赋给RGB。Color类有方法getRed、getGreen和getBlue分别获取对应颜色的RGB值,因此灰色滤镜可以通过如下处理:
public class TextImage {
public static void main(String[] args) {
// 建立窗体
JFrame imageFrame = new JFrame();
imageFrame.setSize(new Dimension(700,700));
imageFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
imageFrame.setLocationRelativeTo(null);
imageFrame.setVisible(true);
Graphics g = imageFrame.getGraphics(); // 获取画笔
int[][] image = getImage("菜狗.jpg"); // 获取图像数据
// 循环绘制图像
for (int i=0;i<image.length;i++){
for (int j=0;j<image[i].length;j++){
Color color = new Color(image[i][j]); // 获取颜色并处理
int red = color.getRed();
int green = color.getGreen();
int blue = color.getBlue();
int ave = (red + green + blue)/3;
g.setColor(new Color(ave,ave,ave)); // 生产对应灰色
g.fillRect(100+i,100+j,1,1);
}
}
}
public static int[][] getImage(String Path){
File image = new File(Path);
BufferedImage buffImage = null;
try {
buffImage = ImageIO.read(image);
} catch (IOException e) {
e.printStackTrace();
}
int[][] imageArr = new int[buffImage.getWidth()][buffImage.getHeight()];
for (int i=0;i<buffImage.getWidth();i++){
for (int j=0;j<buffImage.getHeight();j++){
imageArr[i][j] = buffImage.getRGB(i,j);
}
}
return imageArr;
}
}
经过处理后图片效果如下
同样的道理,通过对应的滤镜算法可以实现滤镜效果。