一张图片除了它原本的样子,还可以让它变变其他的模样————加特效(简单形式)
实现一张图片的“变身”,先来了解了解它“变身”的步骤:
第一步,我们需要获取这张图片,对图片里的信息进行储存(每一张图片的展现,都是由一个个像素点组成):
1、创建一个文件夹对象,存入图片。
2、创建一个数组对象,把图片上的像素点存入数组。
第二步,读取数组中的像素信息,并对每一个点进行颜色更改。
第三步,方法调用。
@@@@其他变身技能
第一步:对图片里的信息进行储存
public class Listener implements MouseListener, ActionListener {
Graphics g;
DrawUI ui;
String name = "直线";
int[][] data1;
BufferedImage buffer; // 定义
//传值
public void setGraph1(Graphics g1) {
g = g1;
}
public void setUi(DrawUI ui) {
this.ui = ui;
}
public void actionPerformed(ActionEvent e) {
name = e.getActionCommand();
System.out.println(name);
// 还原按钮
if (name.equals("Load")) {
load();
} else if (name.equals("Black&White")) {
HeiBai(g);
}else if (name.equals("波纹化")) {
BoWenHua(g);
} else if (name.equals("马赛克")) {
MaSaiKe(g);
}
//缓存图片(加载)
public void load(){
buffer = new BufferedImage(700,700, BufferedImage.TYPE_INT_ARGB);
Graphics graph = buffer.getGraphics();
File file = new File("D:\\java\\code\\liushiqin\\src\\Draw\\16.jpg"); // 获取图片的路径
buffer = ImageIO.read(file1); // 调用ImageIO的read方法根据文件夹读取到一个缓存图像
data1 = new int[buffer.getHeight()][buffer.getWidth()]; //创建数组对象
for(int i=0; i<buffer.getHeight(); i++){ //遍历图像数组
for(int j=0; j<buffer.getWidth(); j++){
data1[i][j]=buffer.getRGB(j,i); //把图像的RGB值保存到数组中
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
```
第二步:读取数组中的像素信息,并对每一个点进行颜色更改。
//特效:黑白(与第一步在同一个类中)
public void HeiBai(Graphics g){
buffer = new BufferedImage(700,700, BufferedImage.TYPE_INT_ARGB);
Graphics graph = buffer.getGraphics();
for(int i=0; i<data1.length; i++){
for(int j=0; j<data1[i].length; j++){
int value = data1[i][j];
int red = (0x00ff0000&value)>>16;
int green = (0x0000ff00&value)>>8;
int blue = 0xff&value;
// System.out.println("黑白Value:"+value);
Color color = new Color(red,red,red);
graph.setColor(color);
graph.drawLine(j,i,j,i);
// graph.fillOval(0, 0, 100, 300);
}
}
// System.out.println("11");
g.drawImage(buffer, 200, 300, null); //横移:200;纵:300
}
@@@@其他变身技能
一:马赛克
```
public void MaSaiKe(Graphics g){
buffer = new BufferedImage(900,900, BufferedImage.TYPE_INT_ARGB);
Graphics graph = buffer.getGraphics();
for(int i=0; i<data1.length; i+=10){
for(int j=0; j<data1[i].length; j+=9){
int value = data1[i][j];
int red = (0x00ff0000&value>>16);
int green = (0x0000ff00&value>>8);
int blue = (0xff&value);
// System.out.println("马赛克Value:"+value);
Color color = new Color(data1[i][j]);
// Color color = new Color(red,green,blue);
graph.setColor(color);
graph.fillRect(j+200,i+300,300,200);
}
}
g.drawImage(buffer, 200,0, null);//画图
}
```
技能二:波纹化
public void BoWenHua(Graphics g){
buffer = new BufferedImage(700,700, BufferedImage.TYPE_INT_ARGB);
Graphics graph = buffer.getGraphics();
for(int i=0; i<data1.length; i++){
for(int j=0; j<data1[i].length; j++){
int value = data1[i][j];
int red = (0x00ff0000&value>>16);
int green = (0x0000ff00&value>>8);
int blue = (0xff&value);
// System.out.println("Value:"+value);
Color color = new Color(data1[i][j]);
graph.setColor(color);
int x=(int)(12*Math.sin((double)i/10)); //X轴方向,点的扭曲尺度。
graph.drawLine(j-x,i,j-x,i);
}
}
g.drawImage(buffer, 200, 300, null);
}
黑白效果:
马赛克效果:
波纹化效果