一、我们需要获取图片
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;
}
}