0
点赞
收藏
分享

微信扫一扫

JAVA处理图片

凌得涂 2022-04-07 阅读 67
java

一、我们需要获取图片

    public int[][] getImagePixArray(String path){
        File file = new File (path);
        java.awt.image.BufferedImage buffimg = null;
        try {
            buffimg = ImageIO.read (file);
        } catch (IOException e) {
            e.printStackTrace ();
        }
        // 获取图片尺寸
        int w = buffimg.getWidth ();
        int h = buffimg.getHeight ();
      
        int[][] imgarr = new int[w][h];
        for(int i = 0; i < w; i++){
            for(int j = 0; j < h; j++){
                imgarr[i][j] = buffimg.getRGB (i, j);
           
            }
        }

        
      
        return imgarr;
    }
     

将图片地址传入后即可得到图片每个点的RGB值构成的二维数组。

二、界面

public class ImageUI  extends JFrame{
	  ImageListener imglisten = new ImageListener ();
    public void initUI(){
      
        setTitle ("图形图像处理");
        setSize (800,800);
        setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
        //居中显示 
        setLocationRelativeTo (null);                               
        // 添加布局
        java.awt.FlowLayout flow = new FlowLayout();
        setLayout (flow);
        // 添加按钮
        addButton();
        // 加载组件之后可视化
        setVisible (true);

       
        imglisten.g = getGraphics ();
    }
  public void paint(java.awt.Graphics g) {
	  super.paint(g);
	  BufferedImage [] chushi=imglisten.buffimgList;
	  int len=imglisten.bfimgSize;
      g.drawImage(chushi[len],100,100,null);
	
  }

 
    public void addButton(){
    
        String[] btnstrs ={
                "原图","马赛克","反片","脸部提亮","灰度","二值化","美白","油画","轮廓提取","撤回"
        };
        for(int i = 0; i < btnstrs.length; i++){
            String btnstr = btnstrs[i];
            JButton btn = new JButton (btnstr);
            add (btn);
            // 按钮添加监听器
            btn.addActionListener (imglisten);
        }
    }

    public static void main(String[] args){
        ImageUI imageUI = new ImageUI ();
        imageUI.initUI ();
    }

}

三监听器部分

public class ImageListener implements java.awt.event.ActionListener{

    java.awt.Graphics g = null;
    BufferedImage []buffimgList=new BufferedImage[1000];
    int bfimgSize=0;
    ImageEff imgeff = new ImageEff ();
    ImageEff imgeff2 = new ImageEff ();

    int[][] imgarr={};
    int[][] imgarr2={};

    public ImageListener(){
       
        String imagPath01 = "C:\\Users\\legion\\Desktop\\屏幕截图 2022-02-19 164328.png";
        String imagPath02 = "C:\\Users\\legion\\Desktop\\屏幕截图 2022-02-19 183750.png";
        imgarr = imgeff.getImagePixArray (imagPath02);
        imgarr2=imgeff2.getImagePixArray (imagPath01);
    }

 {
        System.out.println ("代码块 ");

    }


    public void actionPerformed(java.awt.event.ActionEvent e){
      
        String btnstr = e.getActionCommand ();
        System.out.println ("点击了" + btnstr);
   

       
        if(btnstr.equals ("原图")){
        	BufferedImage img = imgeff.drawImage_01 (imgarr, g);
        	
            buffimgList[bfimgSize]=img;
            bfimgSize++;
            
        } else if(btnstr.equals ("马赛克")){
            
        	BufferedImage img = imgeff.drawImage_02 (imgarr, g);       	
            buffimgList[bfimgSize]=img;
            bfimgSize++;        } 
          else if(btnstr.equals ("反片")){
        	BufferedImage img = imgeff.drawImage_03 (imgarr, g);
            buffimgList[bfimgSize]=img;
            bfimgSize++;
        } else if(btnstr.equals ("脸部提亮")){
        	BufferedImage img = imgeff.drawImage_04 (imgarr, g);
            buffimgList[bfimgSize]=img;
            bfimgSize++;
        } else if(btnstr.equals ("灰度")){
        	BufferedImage img = imgeff.drawImage_05 (imgarr, g);
            buffimgList[bfimgSize]=img;
            bfimgSize++;
        } else if(btnstr.equals ("二值化")){
        	BufferedImage img = imgeff.drawImage_06 (imgarr, g);
            buffimgList[bfimgSize]=img;
            bfimgSize++;
        } else if(btnstr.equals ("美白")){
        	BufferedImage img = imgeff.drawImage_07 (imgarr, g);
            buffimgList[bfimgSize]=img;
            bfimgSize++;
        } else if(btnstr.equals ("油画")){
        	BufferedImage img = imgeff.drawImage_08 (imgarr, g);
            buffimgList[bfimgSize]=img;
            bfimgSize++;

        } else if(btnstr.equals ("轮廓提取")){
        	BufferedImage img = imgeff.drawImage_09 (imgarr, g);
            buffimgList[bfimgSize]=img;
            bfimgSize++;
        } else if(btnstr.equals ("图片融合")){
        	 BufferedImage img=  imgeff.drawImage_10 (imgarr, imgarr2, g);
             buffimgList[bfimgSize]=img;
             bfimgSize++;
        } else if(btnstr.equals ("撤回")){ 
        	if(bfimgSize<=0) {
        	   return;
           }
        	bfimgSize--;
           buffimgList[bfimgSize]=null;
          if(bfimgSize>0) {
        	  BufferedImage buffimg = buffimgList[bfimgSize-1];
              g.drawImage (buffimg,imgeff.X,imgeff.Y,null);
           	  g.drawImage(buffimgList[bfimgSize],100,100,null);
          }
          
        }

    }
}

四、图片效果实现部分

public class ImageEff{

    // 图片绘制坐标的参�?
    final int X = 100;
    final int Y = 100;
    public int[][] getImagePixArray(String path){
        File file = new File (path);
        java.awt.image.BufferedImage buffimg = null;
        try {
            buffimg = ImageIO.read (file);
        } catch (IOException e) {
            e.printStackTrace ();
        }
        // 获取图片尺寸
        int w = buffimg.getWidth ();
        int h = buffimg.getHeight ();
      
        int[][] imgarr = new int[w][h];
        for(int i = 0; i < w; i++){
            for(int j = 0; j < h; j++){
                imgarr[i][j] = buffimg.getRGB (i, j);
           
            }
        }

        
      
        return imgarr;
    }
     
    public BufferedImage drawImage_01(int[][] imgarr, Graphics g){
  
        BufferedImage  img= new BufferedImage
                (imgarr.length, imgarr[0].length, BufferedImage.TYPE_INT_ARGB);
  
        for(int i = 0; i < imgarr.length; i++){
            for(int j = 0; j < imgarr[i].length; j++){
                int rgb = imgarr[i][j];
              
                img.setRGB (i,j,rgb);

            }
        } 
        g.drawImage (img,X,Y,null);
        return img;
    }


    public BufferedImage drawImage_02(int[][] imgarr, Graphics g){
    	BufferedImage  img= new BufferedImage
                (imgarr.length, imgarr[0].length, BufferedImage.TYPE_INT_ARGB); 
    	 Graphics buffg = img.getGraphics ();
    	for(int i = 0; i < imgarr.length - 10; i += 10){
            for(int j = 0; j < imgarr[i].length - 10; j += 10){
                int rgb = imgarr[i][j];
                Color color = new Color (rgb);
                buffg .setColor (color);
                buffg .fillRect (X + i, Y + j, 10, 10);
            }
        }   
    	g.drawImage (img, X, Y, null);
    	    return img;
    }


    public BufferedImage drawImage_03(int[][] imgarr, Graphics g){
    	 BufferedImage  img= new BufferedImage
                 (imgarr.length, imgarr[0].length, BufferedImage.TYPE_INT_ARGB);
    	for(int i = 0; i < imgarr.length; i++){
            for(int j = 0; j < imgarr[i].length; j++){
                int rgb = imgarr[i][j];
                Color color = new Color (rgb);
                int red = color.getRed ();
                int green = color.getGreen ();
                int blue = color.getBlue ();
                Color ncolor = new Color (255 - red, 255 - green, 255 - blue);
                
                img.setRGB (i,j,ncolor.getRGB());
             
            }
        }g.drawImage(img,X,Y,null);
    	return img;
    }

    public BufferedImage drawImage_04(int[][] imgarr, Graphics g){
    	 BufferedImage  img= new BufferedImage
                 (imgarr.length, imgarr[0].length, BufferedImage.TYPE_INT_ARGB);
    	
    	return  img;
    }


    public BufferedImage drawImage_05(int[][] imgarr, Graphics g){
    	 BufferedImage  img= new BufferedImage
                 (imgarr.length, imgarr[0].length, BufferedImage.TYPE_INT_ARGB);
    	for(int i = 0; i < imgarr.length; i++){
            for(int j = 0; j < imgarr[i].length; j++){
                int rgb = imgarr[i][j];
                Color color = new Color (rgb);
                int red = color.getRed ();
                int green = color.getGreen ();
                int blue = color.getBlue ();
                int gray = (int) (red * 0.41 + green * 0.36 + blue * 0.23);
                Color ncolor = new Color (gray, gray, gray);
                img.setRGB (i,j,ncolor.getRGB());
            }
        }g.drawImage(img,X,Y,null);
    	return img;
    }

    public BufferedImage drawImage_06(int[][] imgarr, Graphics g){
      	BufferedImage  img= new BufferedImage
                (imgarr.length, imgarr[0].length, BufferedImage.TYPE_INT_ARGB);
      	for(int i = 0; i <imgarr.length; i++){
      		for(int j = 0; j < imgarr[i].length; j++){
      		int rgb = imgarr[i][j];
      		Color color = new Color (rgb);
      		// 获取RGB三原�?
      		int red = color.getRed ();
      		int green = color.getGreen ();
      		int blue = color.getBlue ();
      		//灰度
      		int gray = (red + green + blue) / 3;
      		// red=green=blue 则照片颜色只剩下灰阶色彩
      		Color nColor = new Color (gray, gray, gray);//0-255
      		// 设置颜色 绘出
      		g.setColor(nColor);
      		g.fillRect (100 + i, 100 + j, 1, 1);
      	if(gray < 50){
      		img.setRGB (i,j,Color.BLACK.getRGB());
      		} else{
      			img.setRGB (i,j,Color.WHITE.getRGB());
      		}
      	}}
      	g.drawImage(img,X,Y,null);
   return img;
    }

    public BufferedImage drawImage_07(int[][] imgarr, Graphics g){
      	BufferedImage  img= new BufferedImage
                (imgarr.length, imgarr[0].length, BufferedImage.TYPE_INT_ARGB);
                  return img;
    }

    public BufferedImage drawImage_08(int[][] imgarr, Graphics g){
    	BufferedImage  img= new BufferedImage
                (imgarr.length, imgarr[0].length, BufferedImage.TYPE_INT_ARGB); 
    	Graphics buffg = img.getGraphics ();
      	for(int i = 0; i < imgarr.length; i+=5){
            for(int j = 0; j < imgarr[i].length; j+=5){
      	    int rgb=imgarr[i][j];
      	    Color color =new Color(rgb);
            	Random random = new Random();
		int range = random.nextInt(20)+5;	
		
		buffg.setColor(color);
		buffg.fillOval(X+i,Y+j, range, range); 
		}
           

    }
      	  return img;
    
    }


    public BufferedImage drawImage_09(int[][] imgarr, Graphics g){
    	BufferedImage  img= new BufferedImage
                (imgarr.length, imgarr[0].length, BufferedImage.TYPE_INT_ARGB);
        for(int i = 0; i < imgarr.length-2; i++){
            for(int j = 0; j < imgarr[i].length-2; j++){
                int rgb = imgarr[i][j];
                Color color = new Color (rgb);
                int red = color.getRed ();
                int green = color.getGreen ();
                int blue = color.getBlue ();
                int gray = (int) (red * 0.41 + green * 0.36 + blue * 0.23);

                // 取出右下斜方向的像素�? 灰度�? 作比�? 
                int nrgb = imgarr[i + 2][j + 2];
                Color ncolor = new Color (nrgb);
                int nred = ncolor.getRed ();
                int ngreen = ncolor.getGreen ();
                int nblue = ncolor.getBlue ();
                int ngray = (int) (nred * 0.41 + ngreen * 0.36 + nblue * 0.23);
                
                if(Math.abs (gray - ngray) > 15){img.setRGB(i,j,color.BLACK.getRGB());
               
                } else{img.setRGB(i,j,color.white.getRGB());
                 
                }
            
            }
        }g.drawImage(img,X,Y,null);return img;
    }
    public BufferedImage drawImage_10(int[][] imgarr1, int[][] imgarr2, Graphics g){
        int w = 0;
        int h = 0;
        if(imgarr1.length < imgarr2.length){
            w = imgarr2.length;
        } else{
            w = imgarr1.length;
        }
        if(imgarr1[0].length < imgarr2[0].length){
            h = imgarr2[0].length;
        } else{
            h = imgarr1[0].length;
        }

        
        BufferedImage img = new BufferedImage
                (w, h, BufferedImage.TYPE_INT_ARGB);//缓冲图片对象


 
        for(int i = 0; i < w; i++){
            for(int j = 0; j < h; j++){
                int rgb = 0;
                int rgb2 = 0;
                if(i < imgarr1.length && j < imgarr1[0].length){
                    rgb = imgarr1[i][j];
                }
                if(i < imgarr2.length && j < imgarr2[0].length){
                    rgb2 = imgarr2[i][j];
                }

                Color color1 = new Color (rgb);
                Color color2 = new Color (rgb2);

                // 创建�?个融合颜�?
                int red = color1.getRed () / 2 + color2.getRed () / 2;
                int green = color1.getGreen () / 2 + color2.getGreen () / 2;
                int blue = color1.getBlue () / 2 + color2.getBlue () / 2;
                Color newColor = new Color (red, green, blue);
                img.setRGB (i, j, newColor.getRGB ());
            }
        }
        // �?次�?�绘制这张照�?
        g.drawImage (img, X, Y, null);
        // 返回img对象
        return img;


    }
}
举报

相关推荐

0 条评论