/*本程序设计了一个功能比较简单的画图工具。充分利用了GUI界面编程,特别有别于别的画图程序,
* 本程序利用了多线程技术,实现了一个对图像进行扭曲的功能。本程序可以支持文件的导入导出,
* 可以对图像进行简单的处理。
* 作者 周欢*/
import java.awt.BasicStroke;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Cursor;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Point;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.image.BufferedImage;
import java.awt.image.ImageObserver;
import java.awt.image.MemoryImageSource;
import java.awt.image.PixelGrabber;
import java.io.File;
import java.util.Random;
import javax.imageio.ImageIO;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JColorChooser;
import javax.swing.JComboBox;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSlider;
import javax.swing.JToolBar;
import javax.swing.JViewport;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.swing.filechooser.FileNameExtensionFilter;
public class Anydraw extends JFrame{//主类 AnyDraw
private static final String PENCIL = "PENCIL";//各种工具的定义
private static final String BRUSH = "BRUSH";
private static final String COLORPICKED = "COLORPICKED";
private static final String ATOMIZER = "ATOMIZER";
private static final String ERASER = "ERASER";
private static final String LINE = "LINE";
private static final String POLYGON = "POLYGON";
private static final String RECT = "RECT";
private static final String ROUND = "ROUND";
private static final String ROUNDRECT = "ROUNDRECT";
JPanel panel;//画图界面
JScrollPane scroll;//画图区的滚动条
JMenuBar menuBar;//菜单栏
JMenu mFile,mEdit,mImage;//菜单栏项目
JMenuItem mNew,mOpen,mSave,mQuit,mEditColor,mImgChange;//菜单子项目
JLabel stateBar; //状态栏
JToolBar toolBardown,toolBarup; //工具栏 :toolBardown用来承载状态栏
Image img;//显示的图像
JViewport viewport = new JViewport();//定义viewport
String fileName,tagetName;//读取图像和存储图像时的路径
BufferedImage bufferimage,tempbuffer;//图像缓存
Graphics2D g;//获取画图环境
int w,h,R=0,G=0,B=0;//图像大小 及现选颜色的三色
float lineWidth = 2.0f;//画笔粗细
Point startp,endp,tempp;//鼠标位置记录
Color currentColor=new Color(R,G,B);//现选颜色
JButton toolbutton[],fillButton;//工具栏选项按钮
int currentTool;//现选工具
JPanel borderPanel=new JPanel();//承载边数显示工具的JPanel
JPanel colorLabel=new JPanel();//当前颜色标签
JPanel colorPanel=new JPanel();//承载颜色选择工具的JPanel
JToolBar colorBack=new JToolBar();//承载颜色选择工具的工具条
JLabel colorR=new JLabel("R");//三个颜色标签
JLabel colorG=new JLabel("G");
JLabel colorB=new JLabel("B");
JLabel showcolorR=new JLabel("0");//三个颜色数值标签
JLabel showcolorG=new JLabel("0");
JLabel showcolorB=new JLabel("0");
JSlider sliderR=new JSlider(JSlider.HORIZONTAL,0,255,0);//三个颜色选择条
JSlider sliderG=new JSlider(JSlider.HORIZONTAL,0,255,0);
JSlider sliderB=new JSlider(JSlider.HORIZONTAL,0,255,0);
JComboBox setPenWidth=new JComboBox();//设置画笔粗细的选择框
JComboBox setBorderCount=new JComboBox();//设置多边形边数的选择框
int border=3;//多边形边数 初始为3
Cursor cu ;//鼠标样式
int[] temp;//图像缓存数组
int[] deal;//处理后图像数组
int r,x1,y1;//变换区域半径r,目标坐标点的源点坐标(x1,y1)
double d,c=0.1,e=1000,dp,drag,dragstep;//目标点离圆心距离d,凹陷变换系数c,扭曲变换系数e,扭曲参数drag
//源始点离圆心距离dp,扭曲变换系数增量dragstep
boolean changed,fill;//记录文档是否修改过 记录是否需要对图像进行填充
Thread imgchange=new Thread(new ImgChange());//进行图像变换的线程
public Anydraw(){//初始化界面
super("Anydraw by zhouhuan");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
w=600;//初始画布大小
h=400;
panel=creatDraw();//创建画布
///////////创建菜单栏/////////////////////
menuBar=new JMenuBar();
setJMenuBar(menuBar);
mFile=new JMenu("文件");
mEdit=new JMenu("编辑");
mImage=new JMenu("图像");
mNew=new JMenuItem("新建");
mOpen=new JMenuItem("打开");
mSave=new JMenuItem("保存");
mQuit=new JMenuItem("退出");
mEditColor=new JMenuItem("编辑色彩");
mImgChange=new JMenuItem("图像变形");
menuBar.add(mFile);
menuBar.add(mEdit);
menuBar.add(mImage);
mFile.add(mNew);
mFile.add(mOpen);
mFile.add(mSave);
mFile.add(mQuit);
mEdit.add(mEditColor);
mImage.add(mImgChange);
///////////创建状态栏/////////////////////
stateBar=new JLabel("here");
toolBardown=new JToolBar();
toolBardown.add(stateBar);
toolBardown.setFloatable(false);
//////////设置事件监听器/////////////////////
MenuListener mListen=new MenuListener();
mNew.addActionListener(mListen);
mOpen.addActionListener(mListen);
mSave.addActionListener(mListen);
mQuit.addActionListener(mListen);
mEditColor.addActionListener(mListen);
mImgChange.addActionListener(mListen);
MouseAction mouseListen=new MouseAction();
panel.addMouseListener(mouseListen);
panel.addMouseMotionListener(mouseListen);
//////////创建工具栏/////////////////////
/******工具初始化********/
JPanel toolPanel=new JPanel();
currentTool=0; //设定初始选定画笔工具
toolBarup=new JToolBar();
toolBarup.setOrientation( toolBarup.HORIZONTAL );//横向工具条
toolBarup.setFloatable( false );
toolBarup.setLayout(new FlowLayout( FlowLayout.LEFT) );//设置工具栏的布局
toolPanel.setLayout( new FlowLayout( FlowLayout.LEFT) );
toolPanel.setPreferredSize(new Dimension(200,85));
toolPanel.setOpaque(false);//对下透明
String[] tool = { PENCIL, BRUSH, COLORPICKED//初始化工具
, ATOMIZER, ERASER, LINE, POLYGON
, RECT, ROUND, ROUNDRECT};
toolbutton=new JButton[tool.length] ;
for( int i = 0 ; i < tool.length ; i++ ) {//增添工具
String way="img/"+tool[i]+".jpg";
Icon icon=new ImageIcon(way);
toolbutton[i]= new JButton(icon);
toolbutton[i].setPreferredSize(new Dimension(30, 20));
toolbutton[i].addActionListener(mListen);//增添工具监听器
toolPanel.add(toolbutton[i]);
}
toolbutton[0].setBackground(new Color(239,196,88)); //初始画笔工具按钮背景
/******画笔粗细初始化********/
JLabel penWidth=new JLabel("画笔粗细"); //画笔粗细设置
toolPanel.add(penWidth);toolPanel.add(setPenWidth);
for (int j=1;j<11;j++)//初始画笔粗细选择框
setPenWidth.addItem(j+"");
setPenWidth.setSelectedIndex(1);
setPenWidth.addItemListener(new ItemListener(){//设置选择框监听器
public void itemStateChanged(ItemEvent arg0) {
if(arg0.getStateChange()==ItemEvent.SELECTED)
{
lineWidth=1+setPenWidth.getSelectedIndex();
g.setStroke(new BasicStroke(lineWidth));//更新画笔粗细
}
}
});
/******填充按钮初始化********/
fillButton=new JButton("填充");//是否填充按钮初始化
fillButton.addActionListener(mListen);//增加事件监听器
toolPanel.add(fillButton);
toolBarup.add(toolPanel);
/******多边形边数初始化********/
JLabel borderCount=new JLabel("多边形边数");
borderPanel.setPreferredSize(new Dimension(80,85));
borderPanel.setLayout( new FlowLayout( FlowLayout.LEFT) );
borderPanel.add(borderCount);
for (int j=3;j<11;j++)//初始多边形边数选择框
setBorderCount.addItem(j+"");
setBorderCount.setSelectedIndex(0);
setBorderCount.addItemList
java 画图程序 图像变形 注释详细
5星 · 超过95%的资源 需积分: 13 103 浏览量
2010-11-20
21:41:35
上传
评论 1
收藏 163KB RAR 举报
jdzw_c
- 粉丝: 4
- 资源: 7
- 1
- 2
前往页