P8美颜相机的实现

一. 基础知识

  • 一幅图就是无数个像素点组成,可以看成宽w高h的二维数组
  • 图像处理的本质是:对代表图像二维数组中的值进行计算
  • 每个像素有自己的RGB值,范围是0-255
    红色R 255 G 0 B 0
    绿色R 0 G 255 B 0
    蓝色R 0 G 0 B 255
  • RGB三个值相等的时候就是灰色,值越大,越接近黑色,越小越接近白色
  • 任意一个int型整数可以代表一个RGB,通过移位以及按位与运算可以分别获得RGB的值,反过来也可以
  • 像素的拆分
                int red = (Pixel >> 16) & 0xFF;
                int green = (Pixel >> 8) & 0xFF;
                int blue = (Pixel >> 0) & 0xFF;
  • 像素的合成
        int value = ((a) << 24) |
                ((r) << 16) |
                ((g ) << 8) |
                ((b ) << 0);
        System.out.println (value);

二. 图片处理

将一个图片转化为一个二维数组并封装

  • 这里涉及到文件操作、IO异常处理
  • 关于File类的使用
    File类是Java提供的针对磁盘中的文件或者目录转换对象的包装类。一个File对象可以代表一个文件或者目录,File对象可以实现获取文件和目录属性等功能,可以实现对文件和目录的创建 删除等功能。
  • 关于BufferedImage类的使用
    作用:一幅图片加载到内存中(BufferedImage生成的图片在内存里有一个图像缓冲区,利用这个缓冲区我们可以很方便地操作这个图片),提供获得绘图对象、图像缩放、选择图像平滑度等功能,通常用来做图片大小变换、图片变灰、设置透明不透明等。
  • 关于ImageIO
    提供read()和write()静态方法,读写图片
   public void getImagePixels(String path){
        File file = new File(path);
        try{
            bufferedImage = ImageIO.read(file);

            srcImageArray = new int[bufferedImage.getWidth()][bufferedImage.getHeight()];
            for(int i=0;i<srcImageArray.length;i++){
                for(int j=0;j<srcImageArray[i].length;j++){
                    srcImageArray[i][j] = bufferedImage.getRGB(i,j);
                }
            }

        }catch(IOException e){
            e.printStackTrace();
        }
    }

三.写一个界面并添加画板和按钮

import javax.swing.*;
import java.awt.*;

public class CameraUI {
    String btn[] ={"原图","马赛克","圆点马赛克","灰度","素描","油画","轮廓检测","美白"};
    public void initUI(){
        JFrame jf = new JFrame();
        jf.setTitle("美颜相机");
        jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        jf.setSize(1100,600);

        JPanel showPanel = new JPanel();
        showPanel.setBackground(Color.LIGHT_GRAY);

        JPanel btnPanel = new JPanel();
        btnPanel.setBackground(Color.WHITE);
        btnPanel.setPreferredSize(new Dimension(200,0));

        initButtonPanel(btnPanel);
        jf.add(showPanel,BorderLayout.CENTER);
        jf.add(btnPanel,BorderLayout.WEST);
        jf.setVisible(true);

    }
    public void initButtonPanel(JPanel btnPanel){
        for(int i=0;i<btn.length;i++){
            JButton bt = new JButton(btn[i]);
            bt.setPreferredSize(new Dimension(95,35));
            bt.setBackground(Color.WHITE);
            btnPanel.add(bt);
        }
    }
    public static void main(String[] args){
        new CameraUI().initUI();
    }

}

四. 添加监听器并将图片信息传递给监听器中

CameraListener cl = new CameraListener();
cl.setPanel(showPanel);

五.马赛克

    public void drawMosaicImage(Graphics g){
        for(int i=0;i<width;i+=10){
            for(int j=0 ;j<height;j+=10){
                int pixel = srcImageArray[i][j];
                Color color = new Color(pixel);
                g.setColor(color);
                g.fillRect(i,j,10,10);
            }
        }
    }

六.灰度

    public void drawGrayImage(Graphics g){
        for(int i=0;i<width;i++){
            for(int j=0;j<height;j++){
                int Pixel = srcImageArray[i][j];
                int red =(Pixel>>16)&0xFF;
                int green =(Pixel>>8)&0xFF;
                int blue = (Pixel>>0)&0xFF;

                int gray = (red +green +blue)/3;
                Color color = new Color(gray,gray,gray);
                g.setColor(color);
                g.fillRect(i,j,1,1);
            }
        }
    }

七.素描

public void drawBinaryImage(Graphics g){
        for(int i=0;i<width;i++){
            for(int j=0;j<height;j++){
                int pixel =srcImageArray[i][j];
                int red = (pixel >> 16) & 0xFF;
                int green = (pixel >> 8) & 0xFF;
                int blue = (pixel >> 0) & 0xFF;

                int gray = (red + green + blue) / 3;

                if(gray < 127){
                    g.setColor (Color.BLACK);
                } else{
                    g.setColor (Color.WHITE);
                }
                g.fillRect (i, j, 1, 1);
            }
        }
    }

美白

    public void drawWhiteImage(Graphics g) {
        for (int i = 0; i < width; i++) {
            for (int j = 0; j < height; j++) {
                int pixel = srcImageArray[i][j];
                Color color = new Color(pixel);
                int red = (pixel >> 16) & 0xFF;
                int green = (pixel >> 8) & 0xFF;
                int blue = (pixel >> 0) & 0xFF;

                if (red < 235 && green < 235 && blue < 235) {
                    Color color1 = new Color(red + 20, green + 20, blue + 20);
                    g.setColor(color1);
                }else{
                    g.setColor(color);
                }
                g.fillRect(i,j,1,1);

            }
        }
    }

油画

    public void drawOilImage(Graphics g){

        Random random = new Random ();


        for(int i = 0; i < width; i += 3){
            for(int j = 0; j < height; j += 3){
                int pixel = srcImageArray[i][j];
                Color color = new Color (pixel);
                g.setColor (color);
                g.fillOval (i, j, random.nextInt (8) + 5, random.nextInt (8) + 5);
            }
        }
    }

轮廓检测

    public void drawImage_02(Graphics g) {
        for (int i = 0; i < width - 2; i++) {
            for (int j = 0; j < height - 2; j++) {
                int pixel = srcImageArray[i][j];

                int red = (pixel >> 16) & 0xFF;
                int green = (pixel >> 8) & 0xFF;
                int blue = (pixel >> 0) & 0xFF;

                int gray = (red + green + blue) / 3;
                int pixel1 = srcImageArray[i + 2][j + 2];
                int red1 = (pixel1 >> 16) & 0xFF;
                int green1 = (pixel1 >> 8) & 0xFF;
                int blue1 = (pixel1 >> 0) & 0xFF;

                int gray1 = (red1 + green1 + blue1) / 3;

                if (Math.abs(gray - gray1) > 25) {
                    bufferedImage.setRGB(i, j, Color.BLACK.getRGB());
                } else {
                    bufferedImage.setRGB(i, j, Color.WHITE.getRGB());
                }
            }
        }
        g.drawImage(bufferedImage, 0, 0, null);
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值