每日小结130929

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、绘制实现这样的图案

 
每日小结130929
 

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;// 改变角度

 实现结果:


每日小结130929
 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); // 绘制文本

 

你可能感兴趣的:(java基础)