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

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

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
主站蜘蛛池模板: 三级黄色片在线观看 | 国内精品久久久久影院网站 | gay台湾无套男同志可播放 | ass巨大胖女人sias | 亚洲欧美日韩国产综合专区 | 丝瓜视频成人在线观看 | 国产精品夜夜爽张柏芝 | 精品福利视频一区二区三区 | 日韩一级欧美一级一级国产 | 逼里逼里香 | 无码11久岁箩筣 | 先锋资源久久 | 小草高清视频免费直播 | 九色PORNY真实丨国产大胸 | 热久久亚洲 | 91精品免费国产高清在线 | 美女全身体光羞羞漫画 | 国产成人精品免费视频大全五级 | 91porn最新地址 | 色综合中文字幕天天在线 | 极品久久 | chinese军人@gay | 高清视频在线播放ww | 欧美在线播放成人免费 | 日韩aⅴ在线观看 | 精品国产免费一区二区三区 | 果冻传媒第一二三专区 | 成人150p| 日韩国产欧美精品综合二区 | 四虎在线免费播放 | 美女被的在线网站91 | 狠狠综合视频精品播放 | 丝袜高跟小说 | 国产白虎 | 日本女人www | 天海翼三级 | 欧美一级鲁丝片免费看 | 丝瓜茄子绿巨人秋葵榴莲污 | 亚洲色欲色欲综合网站 | 国产91精品久久久久久久 | 欧美成人午夜片一一在线观看 |