激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務器之家 - 編程語言 - JAVA教程 - Java圖片處理 (文字水印、圖片水印、縮放、補白)代碼實例

Java圖片處理 (文字水印、圖片水印、縮放、補白)代碼實例

2019-12-24 13:25java教程網 JAVA教程

這篇文章主要介紹了Java圖片處理 (文字水印、圖片水印、縮放、補白)代碼實例,本文直接給出實現代碼,需要的朋友可以參考下

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
package com.hmw.picMark;
 
import java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.geom.AffineTransform;
import java.awt.image.AffineTransformOp;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
 
import javax.imageio.ImageIO;
 
/**
 * 圖片工具類, 圖片水印,文字水印,縮放,補白等
 * @author Carl He
 */
public final class ImageUtils {
    /**圖片格式:JPG*/
    private static final String PICTRUE_FORMATE_JPG = "jpg";
    
    private ImageUtils(){}
    /**
     * 添加圖片水印
     * @param targetImg 目標圖片路徑,如:C://myPictrue//1.jpg
     * @param waterImg 水印圖片路徑,如:C://myPictrue//logo.png
     * @param x 水印圖片距離目標圖片左側的偏移量,如果x<0, 則在正中間
     * @param y 水印圖片距離目標圖片上側的偏移量,如果y<0, 則在正中間
     * @param alpha 透明度(0.0 -- 1.0, 0.0為完全透明,1.0為完全不透明)
     */
    public final static void pressImage(String targetImg, String waterImg, int x, int y, float alpha) {
            try {
                File file = new File(targetImg);
                Image image = ImageIO.read(file);
                int width = image.getWidth(null);
                int height = image.getHeight(null);
                BufferedImage bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
                Graphics2D g = bufferedImage.createGraphics();
                g.drawImage(image, 0, 0, width, height, null);
            
                Image waterImage = ImageIO.read(new File(waterImg));    // 水印文件
                int width_1 = waterImage.getWidth(null);
                int height_1 = waterImage.getHeight(null);
                g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, alpha));
                
                int widthDiff = width - width_1;
                int heightDiff = height - height_1;
                if(x < 0){
                    x = widthDiff / 2;
                }else if(x > widthDiff){
                    x = widthDiff;
                }
                if(y < 0){
                    y = heightDiff / 2;
                }else if(y > heightDiff){
                    y = heightDiff;
                }
                g.drawImage(waterImage, x, y, width_1, height_1, null); // 水印文件結束
                g.dispose();
                ImageIO.write(bufferedImage, PICTRUE_FORMATE_JPG, file);
            } catch (IOException e) {
                e.printStackTrace();
            }
    }
 
    /**
     * 添加文字水印
     * @param targetImg 目標圖片路徑,如:C://myPictrue//1.jpg
     * @param pressText 水印文字, 如:中國證券網
     * @param fontName 字體名稱,    如:宋體
     * @param fontStyle 字體樣式,如:粗體和斜體(Font.BOLD|Font.ITALIC)
     * @param fontSize 字體大小,單位為像素
     * @param color 字體顏色
     * @param x 水印文字距離目標圖片左側的偏移量,如果x<0, 則在正中間
     * @param y 水印文字距離目標圖片上側的偏移量,如果y<0, 則在正中間
     * @param alpha 透明度(0.0 -- 1.0, 0.0為完全透明,1.0為完全不透明)
     */
    public static void pressText(String targetImg, String pressText, String fontName, int fontStyle, int fontSize, Color color, int x, int y, float alpha) {
        try {
            File file = new File(targetImg);
            
            Image image = ImageIO.read(file);
            int width = image.getWidth(null);
            int height = image.getHeight(null);
            BufferedImage bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
            Graphics2D g = bufferedImage.createGraphics();
            g.drawImage(image, 0, 0, width, height, null);
            g.setFont(new Font(fontName, fontStyle, fontSize));
            g.setColor(color);
            g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, alpha));
            
            int width_1 = fontSize * getLength(pressText);
            int height_1 = fontSize;
            int widthDiff = width - width_1;
            int heightDiff = height - height_1;
            if(x < 0){
                x = widthDiff / 2;
            }else if(x > widthDiff){
                x = widthDiff;
            }
            if(y < 0){
                y = heightDiff / 2;
            }else if(y > heightDiff){
                y = heightDiff;
            }
            
            g.drawString(pressText, x, y + height_1);
            g.dispose();
            ImageIO.write(bufferedImage, PICTRUE_FORMATE_JPG, file);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    
    /**
     * 獲取字符長度,一個漢字作為 1 個字符, 一個英文字母作為 0.5 個字符
     * @param text
     * @return 字符長度,如:text="中國",返回 2;text="test",返回 2;text="中國ABC",返回 4.
     */
    public static int getLength(String text) {
        int textLength = text.length();
        int length = textLength;
        for (int i = 0; i < textLength; i++) {
            if (String.valueOf(text.charAt(i)).getBytes().length > 1) {
                length++;
            }
        }
        return (length % 2 == 0) ? length / 2 : length / 2 + 1;
    }
 
    /**
     * 圖片縮放
     * @param filePath 圖片路徑
     * @param height 高度
     * @param width 寬度
     * @param bb 比例不對時是否需要補白
     */
    public static void resize(String filePath, int height, int width, boolean bb) {
        try {
            double ratio = 0; //縮放比例 
      File f = new File(filePath); 
      BufferedImage bi = ImageIO.read(f); 
      Image itemp = bi.getScaledInstance(width, height, BufferedImage.SCALE_SMOOTH); 
      //計算比例 
      if ((bi.getHeight() > height) || (bi.getWidth() > width)) { 
        if (bi.getHeight() > bi.getWidth()) { 
          ratio = (new Integer(height)).doubleValue() / bi.getHeight(); 
        } else
          ratio = (new Integer(width)).doubleValue() / bi.getWidth(); 
        
        AffineTransformOp op = new AffineTransformOp(AffineTransform.getScaleInstance(ratio, ratio), null); 
        itemp = op.filter(bi, null); 
      
      if (bb) { 
        BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); 
        Graphics2D g = image.createGraphics(); 
        g.setColor(Color.white); 
        g.fillRect(0, 0, width, height); 
        if (width == itemp.getWidth(null)) 
          g.drawImage(itemp, 0, (height - itemp.getHeight(null)) / 2, itemp.getWidth(null), itemp.getHeight(null), Color.white, null); 
        else
          g.drawImage(itemp, (width - itemp.getWidth(null)) / 2, 0, itemp.getWidth(null), itemp.getHeight(null), Color.white, null); 
        g.dispose(); 
        itemp = image; 
      }
      ImageIO.write((BufferedImage) itemp, "jpg", f); 
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
 
    public static void main(String[] args) throws IOException {
        pressImage("C://pic//jpg", "C://pic//test.gif", 5000, 5000, 0f);
        pressText("C://pic//jpg", "旺仔之印", "宋體", Font.BOLD|Font.ITALIC, 20, Color.BLACK, 0, 0, 8f);
        resize("C://pic//4.jpg", 1000, 500, true);
    }
}

延伸 · 閱讀

精彩推薦
  • JAVA教程java實現輕量型http代理服務器示例

    java實現輕量型http代理服務器示例

    這篇文章主要介紹了java實現輕量型http代理服務器示例,需要的朋友可以參考下 ...

    Java教程網2472019-11-18
  • JAVA教程java system類使用方法示例 獲取系統信息

    java system類使用方法示例 獲取系統信息

    這篇文章主要介紹了java system類使用方法,該類中的方法都是靜態的。不能被實例化,沒有對外提供構造函數,該類可以獲取系統信息 ...

    java教程網5102019-10-31
  • JAVA教程java讀取csv文件和寫csv示例分享

    java讀取csv文件和寫csv示例分享

    這篇文章主要介紹了JAVA對CSV格式文本數據處理后再保存成新CSV格式文本的模板,可以學習到java讀取csv文件和寫csv的方法,需要的朋友可以參考下 ...

    java技術網2022019-11-14
  • JAVA教程Java8新特性之字符串去重介紹

    Java8新特性之字符串去重介紹

    這篇文章主要介紹了Java8新特性之字符串去重介紹,新的字符串去重特性可以幫助減少應用中String對象的內存占用,目前該特性只適用于G1垃圾收集器,并且...

    junjie3872019-11-28
  • JAVA教程Java中的關鍵字volatile詳解

    Java中的關鍵字volatile詳解

    這篇文章主要介紹了Java中的關鍵字volatile,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小...

    陽光、大地和詩歌4862019-06-19
  • JAVA教程淺析java貪心算法

    淺析java貪心算法

    這篇文章簡單主要介紹了java貪心算法,包含貪心算法的基本思路,性質,以及實現示例,有需要的小伙伴參考下 ...

    hebedich2412019-12-09
  • JAVA教程Java冒泡排序(Bubble Sort)實例講解

    Java冒泡排序(Bubble Sort)實例講解

    冒泡排序的原理:假設要求的數組是正序,兩兩進行比較,如果前一個書比后一個數小,位置不變。如果前一個數比后一個數大,位置互換,再跟后一個數...

    java開發網2622019-10-21
  • JAVA教程jdk中密鑰和證書管理工具keytool常用命令詳解

    jdk中密鑰和證書管理工具keytool常用命令詳解

    keytool JAVA是個密鑰和證書管理工具。它使用戶能夠管理自己的公鑰/私鑰對及相關證書,用于(通過數字簽名)自我認證(用戶向別的用戶/服務認證自己)...

    java教程網3402019-11-04
主站蜘蛛池模板: 日本在线观看高清完整版 | 韩国十九禁高潮床戏在线观看 | 91成| 成人短视频在线播放 | 国产午夜亚洲精品 | 曰批全过程40分钟免费视频多人 | 在线亚洲播放 | 日本教室三级在线看 | 亚洲成人久久精品 | 久久久青| 成人小视频免费在线观看 | 丰满年轻岳中文字幕一区二区 | 成人毛片视频免费 | 极品大长腿啪啪高潮露脸 | 九九热精品视频在线免费观看 | 色播久久 | 国产69精品久久久久久久久久 | 最近中文字幕一区二区 | 杏美月av| 成人在线a | 欧美一级淫片免费视频1 | 毛片av网址| 久久精品在线免费观看 | 二区三区四区视频 | 免费男女乱淫真视频 | 黄色毛片a级 | 久草在线高清 | 成人三级电影网址 | 欧洲黄视频| 欧美一级黄色免费看 | 一级一片免费看 | 国产亚洲网 | 免费性爱视频 | 青青操精品 | 国产精品午夜小视频观看 | 美女被免费网站在线软件 | 春光影院理论片 | 深夜影院一级毛片 | 国产午夜精品久久久久久久蜜臀 | av性色全交蜜桃成熟时 | 欧美成人鲁丝片在线观看 |