代码展示
ImageEFF
import java.awt.Color;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.File;
import javax.imageio.ImageIO;
public class ImageEFF {
public int[][] ImageToArray(String imgpath){
File imgfile=new File(imgpath);
BufferedImage img=null;
try {
img=ImageIO.read(imgfile);
}catch(java.io.IOException e) {
e.printStackTrace();
System.err.println("图像读取失败");
}
int w=img.getWidth();
int h=img.getHeight();
int [][] imgArr=new int [w][h];
for(int i=0;i<w;i++) {
for(int j=0;j<h;j++) {
imgArr[i][j]=img.getRGB(i, j);
}
}
return imgArr;
}
public BufferedImage drawImagenmd(int [][]imgArr1,int [][]imgArr2,Graphics g) {
BufferedImage buffimg=new BufferedImage(imgArr1.length,imgArr1[0].length,BufferedImage.TYPE_INT_ARGB);
for(int i=0;i<imgArr1.length;i++) {
for(int j=0;j<imgArr1[i].length;j++) {
int value=imgArr1[i][j];
int value1=imgArr2[i][j];
buffimg.setRGB(i, j, (value+value1)/2);
}
}
g.drawImage(buffimg, 0,0,null);
return buffimg;
}
public BufferedImage drawImage0(int [][]imgArr,Graphics g) {
BufferedImage buffimg=new BufferedImage(imgArr.length, imgArr[0].length, BufferedImage.TYPE_INT_ARGB);
Graphics buffg=buffimg.getGraphics();
for(int i=0;i<imgArr.length;i+=10) {
for(int j=0;j<imgArr[i].length;j+=10) {
int value=imgArr[i][j];
Color color=new Color(value);
buffg.setColor(color);
buffg.fillRect(i, j, 8, 8);
}
}
g.drawImage(buffimg, 0, 0, null);
return buffimg;
}
public BufferedImage drawImage1(int [][]imgArr,Graphics g) {
BufferedImage buffimg=new BufferedImage(imgArr.length, imgArr[0].length, BufferedImage.TYPE_INT_ARGB);
Graphics buffg=buffimg.getGraphics();
for (int i=0;i<imgArr.length;i++) {
for(int j=0;j<imgArr[i].length;j++) {
int value=imgArr[i][j];
int red=(value>>16)&0xFF;
int green=(value>>8)&0xFF;
int blue=(value>>0)&0xFF;
int gray=(int)(red*0.6+green*0.3+blue*0.1);
Color color=new Color(gray,gray,gray);
buffg.setColor(color);
buffg.fillRect(i, j, 1, 1);
}
}
g.drawImage(buffimg, 0, 0, null);
return buffimg;
}
public BufferedImage drawImage2(int [][]imgArr,Graphics g) {
BufferedImage buffimg = new BufferedImage(imgArr.length, imgArr[0].length, BufferedImage.TYPE_INT_ARGB);
Graphics buffg=buffimg.getGraphics();
for(int i=0;i<imgArr.length;i++) {
for(int j=0;j<imgArr[i].length;j++) {
int value=imgArr[i][j];
int red=(value>>16)&0xFF;
int green=(value>>8)&0xFF;
int blue=(value>>0)&0xFF;
int gray=(int)(red*0.4+green*0.3+blue*0.3);
if(gray<127) {
buffg.setColor(Color.BLACK);
}else {
buffg.setColor(Color.white);
}
buffg.fillRect(i, j, 1, 1);
}
}
g.drawImage(buffimg, 0, 0, null);
return buffimg;
}
public BufferedImage drawImage3(int [][]imgArr,Graphics g) {
BufferedImage buffimg = new BufferedImage(imgArr.length, imgArr[0].length, BufferedImage.TYPE_INT_ARGB);
Graphics buffg=buffimg.getGraphics();
for(int i=0;i<imgArr.length-2;i++) {
for(int j=0;j<imgArr[i].length-2;j++) {
int value=imgArr[i][j];
int red=(value>>16)&0xFF;
int green=(value>>8)&0xFF;
int blue=(value>>0)&0xFF;
int gray=(int)(red*0.4+green*0.3+blue*0.3);
int valueN=imgArr[i+2][j+2];
int redN=(valueN>>16)&0xFF;
int greenN=(value>>8)&0xFF;
int blueN=(value>>0)&0xFF;
int grayN=(int)(redN*0.4+greenN*0.3+blueN*0.3);
if(Math.abs(gray-grayN)>15) {
buffg.setColor(Color.red);
}else {
buffg.setColor(Color.white);
}
buffg.fillRect(i, j, 1, 1);
}
}
g.drawImage(buffimg, 0, 0, null);
return buffimg;
}
public BufferedImage drawImage5(int [][]imgArr,Graphics g) {
BufferedImage buffimg=new BufferedImage(imgArr.length, imgArr[0].length, BufferedImage.TYPE_INT_ARGB);
Graphics buffg=buffimg.getGraphics();
for(int i=0;i<imgArr.length;i+=10) {
for(int j=0;j<imgArr[i].length;j+=10) {
int value=imgArr[i][j];
Color color=new Color(value);
buffg.setColor(color);
buffg.fillRect(i, j, 10, 10);
}
}
g.drawImage(buffimg, 0, 0, null);
return buffimg;
}
public void drawImage6(int [][]imgArr,Graphics g) {
BufferedImage buffimg=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 value=imgArr[i][j];
buffimg.setRGB(i, j, value);
}
}
g.drawImage(buffimg, 50,50,200,200,null);
}
public BufferedImage drawImagelaozi(int [][]imgArr,Graphics g) {
BufferedImage buffimg=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 value=imgArr[i][j];
buffimg.setRGB(i, j, value);
}
}
g.drawImage(buffimg, 0,0,null);
return buffimg;
}
}
ImageListene
import java.awt.*;
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import java.awt.event.MouseEvent;
import java.awt.image.BufferedImage;
import java.util.Stack;
public class ImageListener extends ListenerUtils {
public Graphics g;
JPanel jp;
String path="F:\\自己填\\作业\\1.png";
String path1="F:\\自己填\\作业\\2.jpg";
String path2="F:\\自己填\\作业\\3.jpg";
public String btnstrs;
BufferedImage [] buffimgs=new BufferedImage[100];
Stack<BufferedImage> buffstack= new Stack<BufferedImage>();
int index=0;
int indexmsk=0;
int x1,y1,x2,y2;
int x3,y3;
int[][] imgArr;
int[][] imgArr1;
int[][] imgArr2;
ImageEFF imgeff;
ImageListener(){
imgeff = new ImageEFF();
imgArr=imgeff.ImageToArray(path);
imgArr1=imgeff.ImageToArray(path1);
imgArr2=imgeff.ImageToArray(path2);
}
@Override
public void actionPerformed(ActionEvent e) {
btnstrs =e.getActionCommand();
if(btnstrs.equals("原图")) {
BufferedImage img=imgeff.drawImagelaozi(imgArr, g);
buffimgs[index++]=img;
indexmsk++;
System.out.println("index"+index);
}
else if(btnstrs.equals("马赛克")) {
BufferedImage img=imgeff.drawImage5(imgArr, g);
buffimgs[index++]=img;
indexmsk++;
System.out.println("index"+index);
}
else if(btnstrs.equals("马赛克瓷砖")) {
BufferedImage img=imgeff.drawImage0(imgArr, g);
buffimgs[index++]=img;
indexmsk++;
buffstack.push(img);
}
else if(btnstrs.equals("灰度")) {
BufferedImage img=imgeff.drawImage1(imgArr, g);
buffimgs[index++]=img;
indexmsk++;
System.out.println("index"+index);
}
else if(btnstrs.equals("轮廓检测")) {
BufferedImage img=imgeff.drawImage3(imgArr, g);
buffimgs[index++]=img;
indexmsk++;
buffstack.push(img);
}
else if(btnstrs.equals("二值化")) {
BufferedImage img=imgeff.drawImage2(imgArr, g);
buffimgs[index++]=img;
indexmsk++;
buffstack.push(img);
}
else if(btnstrs.equals("缩小")) {
BufferedImage buffimg=buffimgs[indexmsk-1];
BufferedImage buffimg1=new BufferedImage(buffimg.getWidth(), buffimg.getHeight(), BufferedImage.TYPE_INT_ARGB);
Graphics buffg=buffimg1.getGraphics();
for(int i=0;i<buffimg.getWidth();i++) {
for(int j=0;j<buffimg.getHeight();j++) {
int rgbvalue=buffimg.getRGB(i,j);
Color color=new Color(rgbvalue);
buffimg1.setRGB(i, j, rgbvalue);
}
}
g.drawImage(buffimg, 0,0,200,200,null);
buffimgs[index++]=buffimg1;
indexmsk++;
}
else if(btnstrs.equals("撤回")) {
if(index==0)
{
return;
}
else
{
buffimgs[index-1]=null;
index--;
}
jp.repaint();
}
else if(btnstrs.equals("油画融合")) {
BufferedImage img=imgeff.drawImagenmd(imgArr1,imgArr2, g);
buffimgs[index++]=img;
indexmsk++;
}
}
@Override
public void mousePressed(MouseEvent e) {
super.mousePressed(e);
if(btnstrs.equals("选择截屏区域")) {
x1=e.getX();
y1=e.getY();
}
}
@Override
public void mouseReleased(MouseEvent e) {
super.mouseReleased(e);
if(btnstrs.equals("选择截屏区域")) {
x2=e.getX();
y2=e.getY();
}
}
@Override
public void mouseDragged(MouseEvent e) {
System.out.println("拖动");
int oldx=0;
int oldy=0;
if("局部马赛克".equals(btnstrs)) {
BufferedImage buffimg=buffimgs[indexmsk-1];
BufferedImage buffimg1=new BufferedImage(buffimg.getWidth(), buffimg.getHeight(), BufferedImage.TYPE_INT_ARGB);
Graphics buffg1=buffimg1.getGraphics();
int x=e.getX();
int y=e.getY();
if((Math.abs(x-oldx)*Math.abs(y-oldy))<100) {
return;
}
else {
oldx=x;
oldy=y;
}
int rgbvalue=buffimg.getRGB(x, y);
Color color=new Color(rgbvalue);
buffg1.setColor(color);
buffg1.fillRect(x, y, 10, 10);
g.drawImage(buffimg1, 0, 0, null);
buffimgs[index++]=buffimg1;
System.out.println("index="+index);
}
}
@Override
public void mouseClicked(MouseEvent e) {
if(btnstrs.equals("截屏放置区域")) {
x3=e.getX();
y3=e.getY();
BufferedImage buffimg=buffimgs[indexmsk-1];
BufferedImage buffimg1=new BufferedImage(buffimg.getWidth(), buffimg.getHeight(), BufferedImage.TYPE_INT_ARGB);
Graphics buffg=buffimg1.getGraphics();
for(int i=x1;i<=x2;i++) {
for(int j=y1;j<=y2;j++) {
int rgbvalue=buffimg.getRGB(i,j);
Color color=new Color(rgbvalue);
buffg.setColor(color);
buffg.fillRect(i, j, 1, 1);
}
}
g.drawImage(buffimg1,x3,y3,x2-x1,y2-y1,null);
buffimgs[index++]=buffimg1;
indexmsk++;
}
}
@Override
public void keyPressed(KeyEvent e) {
super.keyPressed(e);
}
}
ListenerUtils
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
public class ListenerUtils implements ActionListener,MouseListener,MouseMotionListener,KeyListener,ChangeListener{
@Override
public void stateChanged(ChangeEvent e) {
}
@Override
public void keyTyped(KeyEvent e) {
}
@Override
public void keyPressed(KeyEvent e) {
}
@Override
public void keyReleased(KeyEvent e) {
}
@Override
public void mouseDragged(MouseEvent e) {
}
@Override
public void mouseMoved(MouseEvent e) {
}
@Override
public void mouseClicked(MouseEvent e) {
}
@Override
public void mousePressed(MouseEvent e) {
}
@Override
public void mouseReleased(MouseEvent e) {
}
@Override
public void mouseEntered(MouseEvent e) {
}
@Override
public void mouseExited(MouseEvent e) {
}
@Override
public void actionPerformed(ActionEvent e) {
}
}
ImageUI
import javax.swing.*;
import java.awt.*;
import java.awt.image.BufferedImage;
public class ImageUI extends JPanel{
String [] btnstrs= {"原图","马赛克","灰度","二值化","马赛克瓷砖","轮廓检测","手绘风格","怀旧","油画融合","局部马赛克","缩小","截屏放置区域","选择截屏区域","撤回"};
static final ImageListener imageListener=new ImageListener();
public static void main(String[] args) {
new ImageUI().initUI();
}
public void initUI() {
JFrame jf=new JFrame("图形编程");
jf.setSize(800,600);
jf.setDefaultCloseOperation(3);
jf.setLocationRelativeTo(null);
JPanel jp1= new JPanel();
jp1.setBackground(Color.DARK_GRAY);
Dimension dim=new Dimension(120,0);
jp1.setPreferredSize(dim);
Dimension btndim=new Dimension(110,35);
for(int i=0;i<btnstrs.length;i++) {
JButton btn=new JButton(btnstrs[i]);
btn.setBackground(Color.white);
btn.setPreferredSize(btndim);
btn.addActionListener(imageListener);
jp1.add(btn);
}
this.setBackground(Color.BLACK);
this.addMouseListener(imageListener);
this.addMouseMotionListener(imageListener);
this.addKeyListener(imageListener);
jf.add(jp1,BorderLayout.EAST);
jf.add(this);
jf.setVisible(true);
Graphics g=this.getGraphics();
imageListener.g=g;
imageListener.jp=this;
}
@Override
public void paint(Graphics g) {
super.paint(g);
BufferedImage []imgs=imageListener.buffimgs;
for(int i=0;i<imgs.length;i++) {
if(imgs[i]==null) {
return;
}
g.drawImage(imgs[i], 0, 0,this.getWidth(),this.getHeight(), null);
BufferedImage buffimg1=new BufferedImage(this.getWidth(), this.getHeight(), BufferedImage.TYPE_INT_ARGB);
Graphics buffg1=buffimg1.getGraphics();
buffg1.drawImage(imgs[imageListener.index-1], 0, 0,this.getWidth(),this.getHeight(), null);
imgs[imageListener.index-1]=buffimg1;
g.drawImage(buffimg1, 0, 0, null);
System.out.println("i="+i);
}
}
}