1、平移图形
public void paint(Graphics g) { // 重写paint()方法 Graphics2D g2 = (Graphics2D) g; // 获得Graphics2D对象 Rectangle2D.Float rect = new Rectangle2D.Float(10, 10, 80, 50);// 创建矩形对象 BasicStroke stroke = new BasicStroke(10); // 创建宽度是10的笔画对象 g2.setStroke(stroke);// 设置笔画对象 g2.clearRect(0, 0, 338, 230); // 清除原有内容 if (flag == 0) { g2.translate(0, 0);// 平移坐标轴 g2.draw(rect);// 绘制矩形 } else if (flag == 1) { g2.translate(120, 60);// 平移坐标轴 g2.draw(rect);// 绘制矩形 } }
2、绘制实现这样的图案
public void paint(Graphics g) { // 重写paint()方法 Graphics2D g2 = (Graphics2D)g; // 获得Graphics2D对象 Ellipse2D.Float ellipse = new Ellipse2D.Float(80, 95, 160, 10);// 创建椭圆对象 Random random = new Random();// 创建随机数对象 int i=0; while (i<100){ int R = random.nextInt(256);//随机产生颜色的R值 int G = random.nextInt(256);//随机产生颜色的G值 int B = random.nextInt(256);//随机产生颜色的B值 Color color = new Color(R,G,B);//创建新的颜色对象 g2.setColor(color);//指定颜色 g2.rotate(10,160,100);// 旋转画布,以坐标点(160,100)为原点旋转10度。 g2.draw(ellipse);// 绘制椭圆 i++; }
3、实现字以弧形出现
int width = getWidth();// 获得面板宽度 int height = getHeight();// 获得面板高度 char[] array = " 明日科技有限公司 ".toCharArray();// 把字符串转换为字符数组 int len = array.length * 2;// 定义半径 Font font = new Font("宋体", Font.BOLD, 10);// 创建新字体 g2.setFont(font);// 设置字体 double angle = 0;// 初始角度 for (int i = 0; i < array.length; i++) {// 遍历字符串中的字符 int x = (int) (len * Math.sin(Math.toRadians(angle + 270)));// 计算每个文字的位置 int y = (int) (len * Math.cos(Math.toRadians(angle + 270)));// 计算每个文字的位置 g2.drawString(array[i] + "", width / 2 + x-75 , height / 2 - y-40 );// 绘制每个字符,其中168和95是坐标平移值 angle = angle + 360d / array.length;// 改变角度
实现结果:
使用Area类实现:将指定 Area
的形状添加到此 Area
的形状中。得到的 Area
形状将包括两个形状的并集,或者包含此 Area
或指定 Area
中的所有区域。
Graphics2D g2 = (Graphics2D)g; // 获得Graphics2D对象 Ellipse2D.Float ellipse1 = new Ellipse2D.Float(20, 70, 160, 60);// 创建椭圆对象 Ellipse2D.Float ellipse2 = new Ellipse2D.Float(120, 20, 60, 160);// 创建椭圆对象 Area area1 = new Area(ellipse1); // 创建区域椭圆 Area area2 = new Area(ellipse2); // 创建区域椭圆 area1.add(area2);// 两个区域椭圆进行加运算 g2.draw(area1); // 绘制加运算后的区域椭圆
5、图形的减运算
同上, 从此 Area
的形状中减去指定 Area
的形状。得到的 Area
形状将包括那些仅包括那些包含在此 Area
且不包含在指定 Area
中的区域。
Graphics2D g2 = (Graphics2D)g; // 获得Graphics2D对象 Ellipse2D.Float ellipse1 = new Ellipse2D.Float(20, 20, 160, 160);// 创建圆对象 Ellipse2D.Float ellipse2 = new Ellipse2D.Float(90, 20, 160, 160);// 创建圆对象 Area area1 = new Area(ellipse1); // 创建区域圆 Area area2 = new Area(ellipse2); // 创建区域圆 area1.subtract(area2);// 两个区域圆进行减运算 g2.fill(area1); // 绘制减运算后的区域圆
6、图形的其他运算
都是通过Area类进行实现
intersect:图形的交运算;将此 Area
的形状设置为其当前形状与指定 Area
形状的交集。得到的 Area
形状将仅包括那些既包含在此 Area
中也包含在指定 Area
中的区域。
exclusiveOr:图形的异或运算;将此 Area
的形状设置为其当前形状与指定 Area
形状的组合区域,并减去其交集。得到的 Area
形状将仅包括那些包含在此 Area
或指定 Area
中、但不同时出现在两者中的区域。
7、绘制图片
img = Toolkit.getDefaultToolkit().getImage("img/image.jpg"); // 获取图像资源 g.drawImage(img, 0, 0, null); // 绘制指定的图片
8、使用滑块对象进行图形的缩放
(1)滑块对象的实现与监听器的设置(ChangeListener)
slider = new JSlider();// 创建滑块对象 slider.addChangeListener(new ChangeListener() { public void stateChanged(final ChangeEvent e) { imagePanel.repaint();// 重新调用面板类的paint()方法 } });
(2)图形的缩放
public void paint(Graphics g) { g.clearRect(0, 0, this.getWidth(), this.getHeight());// 清除绘图上下文的内容 imgWidth = img.getWidth(null); // 获取图片宽度 imgHeight = img.getHeight(null); // 获取图片高度 float value = slider.getValue();// 滑块组件的取值 newW = (int) (imgWidth * value / 50);// 计算图片缩放后的宽度 newH = (int) (imgHeight * value / 50);// 计算图片缩放后的高度 g.drawImage(img, 0, 0, newW, newH, null);// 绘制指定大小的图片 }
9、图形的翻转
g.drawImage(img, dx1, dy1, dx2, dy2, sx1, sy1, sx2, sy2, this);// 绘制图像
使用上述代码完成:绘制当前可用的指定图像的指定区域,动态地缩放图像使其符合目标绘制表面的指定区域。执行图像从源到目标的缩放:源矩形的第一个坐标被映射到目标矩形的第一个坐标,第二个源坐标被映射到第二个目标坐标。按需要缩放和翻转子图像以保持这些映射关系。
如果要实现水平翻转:交换sx1与sx2;
如果要实现垂直翻转:交换sy1与sy2;
也就是说:实现源矩形(sx1, sy1, sx2, sy2)到目标矩形(dx1, dy1, dx2, dy2)的映射。
10、图片的旋转
同样使用rotate
Graphics2D g2 = (Graphics2D) g; // 获得Graphics2D对象 g2.drawImage(img, 80, 10, 260, 150, this); // 绘制指定大小的图片 //将用角度表示的角转换为近似相等的用弧度表示的角。 g2.rotate(Math.toRadians(10)); // 将图片旋转10度 g2.drawImage(img, 80, 10, 260, 150, this); // 绘制指定大小的图片
11、图像的倾斜
同样使用shear
g2.shear(0.5, 0.5);// 倾斜图像
12、实现拖动改变图形大小
只需设置重绘即可
private int pressPanelX = 0, pressPanelY = 0;// 鼠标按下点的X、Y坐标 private int pressX = 0, pressY = 0;// 鼠标按下点在屏幕上的X、Y坐标 private int releaseX = 0, releaseY = 0;// 鼠标释放点在屏幕上的X、Y坐标 private Robot robot = null; // 声明Robot对象 private BufferedImage buffImage = null; // 声明缓冲图像对象 public void paint(Graphics g) { g.clearRect(0, 0, this.getWidth(), this.getHeight());// 清除绘图上下文的内容 try { robot = new Robot();// 创建Robot对象 if (releaseX - pressX > 0 && releaseY - pressY > 0) { Rectangle rect = new Rectangle(pressX, pressY, releaseX - pressX, releaseY - pressY);// 创建Rectangle对象 buffImage = robot.createScreenCapture(rect);// 获得缓冲图像对象 cutImagePanel.repaint(); // 调用CutImagePanel面板的paint()方法 } } catch (AWTException e1) { e1.printStackTrace(); } g.drawImage(buffImage, 0, 0, releaseX - pressX, releaseY - pressY, this);// 绘制图像 }
13、实现图像的亮度调整
(1)先创建一个BufferedImage对象,再在这个缓冲图像上绘制图片
image = new BufferedImage(img.getWidth(this), img.getHeight(this),BufferedImage.TYPE_INT_RGB);// 创建缓冲图像对象 image.getGraphics().drawImage(img, 0, 0, null);// 在缓冲图像对象上绘制图像 oldImage = image;// 存储原来的图像对象,用于以后的恢复操作
(2)调亮调暗都需要使用到RescaleOp类
RescaleOp类:通过将每个像素的样本值乘以一个缩放因子,然后加上一个偏移量,此类对源图像中数据进行逐像素重缩放。缩放后的样本值被限制在目标图像中的最小/最大可表示形式。
button_3.addActionListener(new ActionListener() { public void actionPerformed(final ActionEvent e) { float a = 1.0f;// 定义缩放因子 float b = -5.0f;// 定义偏移量 RescaleOp op = new RescaleOp(a,b,null);// 创建具有指定缩放因子和偏移量的 RescaleOp对象 image = op.filter(image, null);// 对源图像中的数据进行逐像素重缩放,达到变暗的效果 repaint();// 重新绘制图像 } }); button_3.setText("变 暗");
14实现彩色图像变为灰色
(1)先创建一个BufferedImage对象,再在这个缓冲图像上绘制图片
同上;
(2)使用ColorSpace类和 ColorConvertOp类实现
ColorSpace:此类包含了可将指定颜色空间中的颜色与 sRGB 和定义良好的 CIEXYZ 颜色空间中的颜色进行相互转换的方法。
ColorConvertOp:此类对源图像中的数据执行逐像素的颜色转换。得到的颜色值可以扩展到目标图像的精度。颜色转换可以通过 ColorSpace 对象的数组或 ICC_Profile 对象的数组指定。
ColorSpace colorSpace1 = ColorSpace.getInstance(ColorSpace.CS_GRAY);// 创建内置线性为灰度的颜色空间 ColorSpace colorSpace2 = ColorSpace.getInstance(ColorSpace.CS_LINEAR_RGB);// 创建内置线性为 RGB的颜色空间 ColorConvertOp op = new ColorConvertOp(colorSpace1,colorSpace2, null);// 创建进行颜色转换的对象 image = op.filter(image, null);// 对缓冲图像进行颜色转换 repaint();// 重新绘制图像
15、使用像素生成图像
// 创建使用数组为Image生成像素值的ImageProducer对象 ImageProducer imageProducer = new MemoryImageSource(w, h, pix, 0, w); Image img = createImage(imageProducer);// 创建图像对象 g.drawImage(img, 0, 0,getWidth(),getHeight(), this);// 绘制图像
其中:MemoryImageSource(w, h, pix, 0, w);各个参数代表的意思:
w
- 像素矩形的宽度h
- 像素矩形的高度pix
- 一个像素数组0 - 数组中存储首个像素的偏移量w - 数组中一行像素到下一行像素之间的距离
16、立体效果的文字实现
先循环绘制灰色文本,在绘制一次黑色文本即可
g.setColor(Color.GRAY);// 设置颜色为灰色 int i = 0;// 循环变量 while (i<8){ g.drawString(value, x, y); // 绘制文本 x+=1;// 调整绘制点的横坐标值 y+=1;// 调整绘制点的纵坐标值 i++;// 调整循环变量的值 } g.setColor(Color.BLACK);// 设置颜色黑色 g.drawString(value, x, y); // 绘制文本
17、阴影效果的文字实现
先绘制灰色文本一次,再在其左下侧绘制一次黑色文本
g.setColor(Color.GRAY);// 设置颜色为灰色 g.drawString(value, x, y); // 绘制文本 x -= 3;// 调整绘制点的横坐标值 y -= 3;// 调整绘制点的纵坐标值 g.setColor(Color.BLACK);// 设置颜色黑色 g.drawString(value, x, y); // 绘制文本