给图片“变变身”

 

一张图片除了它原本的样子,还可以让它变变其他的模样————加特效(简单形式)

实现一张图片的“变身”,先来了解了解它“变身”的步骤:

      第一步,我们需要获取这张图片,对图片里的信息进行储存(每一张图片的展现,都是由一个个像素点组成):
            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);
	}
	

黑白效果:

 

马赛克效果:

 

 

波纹化效果

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值