1. 程式人生 > >使用awt中的類操作圖片縮放、變圓透明、水印、合併

使用awt中的類操作圖片縮放、變圓透明、水印、合併

本文是因為以前寫過的一個公眾號,需要做這些操作,現在總結一下。當時對awt只限於瞭解,用到的時候看了看文件和別人的程式碼,做了幾次測試後寫的一個整合工具。

本文會依據先後順序介紹使用awt的工具類對圖片進行縮放、變圓透明、合併、水印,雖然每個都是分步的,但是使用者可以看下api根據實際情況把縮放、變圓透明這些功能放在一個方法中。

圖片縮放大小

使用者可以根據具體API和程式碼的例子自行實現(下述示例的程式碼並不規範,僅作為演示功能使用


public void testResizeImage() throws IOException {
        File imageFile = new
File("E:\\test\\header.png"); //縮放後的寬度和高度 int width = 120, height = 120; BufferedImage imageBuffer = ImageIO.read(imageFile); BufferedImage tempBuffer = new BufferedImage(width, height, BufferedImage.TYPE_INT_BGR); //使用tempBuffer建立一個temp畫板 Graphics graphics = tempBuffer.createGraphics(); //把原檔案畫在這個畫板上
graphics.drawImage(imageBuffer, 0, 0, width, height, null); imageBuffer.flush(); tempBuffer.flush(); String filePath = "E:\\test\\header-120x120.png"; File temp = new File(filePath); temp.createNewFile(); //把畫出來120*120圖片的buffer寫到temp檔案 ImageIO.write(tempBuffer, "png"
, temp); }

效果圖如下所示:
這裡寫圖片描述

圖片變圓透明

使用者可以根據具體API和程式碼的例子自行實現(下述示例的程式碼並不規範,僅作為演示功能使用


    /**
     * 圖片變圓,四個角變透明
     * @throws IOException
     */
    public void testResizeCircle() throws IOException {
        File imageFile = new File("E:\\test\\header-120x120.png");
        BufferedImage imageBuffer = ImageIO.read(imageFile);
        int width = imageBuffer.getWidth(), height = imageBuffer.getHeight();

        BufferedImage tempBuffer = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
        Ellipse2D.Double shape = new Ellipse2D.Double(0, 0, width, height);

        Graphics2D g2 = tempBuffer.createGraphics();
        tempBuffer = g2.getDeviceConfiguration().createCompatibleImage(width, height, Transparency.TRANSLUCENT);
        g2 = tempBuffer.createGraphics();
        g2.setComposite(AlphaComposite.Clear);
        g2.fill(new Rectangle(width, height));
        g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC, 1.0f));
        g2.setClip(shape);
        g2.drawImage(imageBuffer, 0, 0, null);
        g2.dispose();


        ImageIO.write(tempBuffer, "png", imageFile);
    }

效果圖如下所示:
這裡寫圖片描述

圖片合併

使用者可以根據具體API和程式碼的例子自行實現(下述示例的程式碼並不規範,僅作為演示功能使用

    //合併兩個圖片(也可以合併多個)
    public void testMerge() throws IOException {
        File newFile = new File("E:\\test\\merge.jpg");
        File backgroundFile = new File("E:\\test\\background.jpg");
        File headerFile = new File("E:\\test\\header-120x120.png");
        BufferedImage backgroundImage = ImageIO.read(backgroundFile); //背景圖片
        BufferedImage headerImage = ImageIO.read(headerFile); //頭像圖片
        int bWidth = backgroundImage.getWidth(), bHeight = backgroundImage.getHeight();
        int hWidth = headerImage.getWidth(), hHeight = headerImage.getHeight();

        BufferedImage combined = new BufferedImage(bWidth, bHeight, BufferedImage.TYPE_INT_RGB);
        Graphics g = combined.getGraphics();
        //先把背景圖畫到畫板上
        g.drawImage(backgroundImage, 0, 0, null);

        //計算出頭像放置的 Y 軸位置
        Double tempHeight1 = backgroundImage.getHeight() * 0.2;
        Long tempHeight2 = Math.round(tempHeight1);
        Integer headerImageY = Integer.valueOf(tempHeight2.toString());
        g.drawImage(headerImage, (bWidth - hWidth) / 2, headerImageY, null);

        newFile.createNewFile();
        ImageIO.write(combined, "jpg", newFile);
    }

效果圖如下所示:
這裡寫圖片描述

圖片水印

使用者可以根據具體API和程式碼的例子自行實現(下述示例的程式碼並不規範,僅作為演示功能使用

//圖片加水印
    public void testWaterMark() throws IOException {
        File uploadFile = new File("E:\\test\\background.jpg");
        Font font = new Font(Font.MONOSPACED, Font.BOLD, 20);// 新增字型的屬性設定

        BufferedImage uploadImage = ImageIO.read(uploadFile);
        int width = uploadImage.getWidth();
        int height = uploadImage.getHeight();

        BufferedImage combined = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
        Graphics g = combined.getGraphics();
        g.drawImage(uploadImage, 0, 0, null);
        g.setFont(font);
        g.setColor(Color.RED);
        g.drawString("PBlog | www.pelinli.com", 10, 20);
        g.drawString("https://github.com/penglongli", 10, 40);

        ImageIO.write(combined, "png", uploadFile);
    }

效果圖如下所示:
這裡寫圖片描述