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;// 改变角度
实现结果:
4、图形的加运算
使用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); // 绘制文本