一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

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

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
主站蜘蛛池模板: 国产一精品一av一免费爽爽 | 91精品国产91久久久久久 | 日韩精品成人a在线观看 | 日产欧产va1| 超级乱淫伦小说全集np | 2022日韩理论片在线观看 | 国产精品视频免费一区二区三区 | xxxxxx性受| 久久成人免费大片 | 美女国内精品自产拍在线播放 | 被黑人同学彻底征服全文小说阅读 | 忘忧草在线社区WWW日本直播 | 亚洲欧美日韩中文高清一 | 免费观看视频高清在线 | 99在线观看免费视频 | 国产成人精品高清免费 | 亚洲欧美久久婷婷爱综合一区天堂 | 国产一久久香蕉国产线看观看 | 女仆掀起蕾丝裙被打屁股作文 | 操操久久| 成人永久免费视频 | 精品亚洲午夜久久久久 | 成品人视频免费观看 | 欧美日韩一区视频 | 亚洲高清中文字幕一区二区三区 | 啊啊啊好大视频 | 国产高清不卡码一区二区三区 | 邪恶肉肉全彩色无遮盖 | 丝瓜视频看污片 | 亚洲高清在线天堂精品 | 亚洲一欧洲中文字幕在线 | 精品国产91久久久久 | 1024日韩基地 | 国产综合欧美日韩视频一区 | 无套内射在线观看THEPORN | 青青艹视频在线 | 精品视频免费 | 99午夜高清在线视频在观看 | 国产精品亚洲综合第一区 | 国产成人愉拍免费视频 | 亚洲成年男人的天堂网 |