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圖片處理 (文字水印、圖片水印、縮放、補白)代碼實例
2019-12-24 13:25java教程網 JAVA教程
這篇文章主要介紹了Java圖片處理 (文字水印、圖片水印、縮放、補白)代碼實例,本文直接給出實現代碼,需要的朋友可以參考下
延伸 · 閱讀
- 2019-12-25在CentOS系統中檢測Java安裝及運行jar應用的方法
- 2019-12-24Java實現計算一個月有多少天和多少周
- 2019-12-24在CentOS系統上安裝Java的openjdk的方法
- 2019-12-24Java生成MD5加密字符串代碼實例
- 2019-12-24Java數據導出功能之導出Excel文件實例
- 2019-12-24Java數據導入功能之讀取Excel文件實例
- JAVA教程
java實現輕量型http代理服務器示例
這篇文章主要介紹了java實現輕量型http代理服務器示例,需要的朋友可以參考下 ...
- JAVA教程
java system類使用方法示例 獲取系統信息
這篇文章主要介紹了java system類使用方法,該類中的方法都是靜態的。不能被實例化,沒有對外提供構造函數,該類可以獲取系統信息 ...
- JAVA教程
java讀取csv文件和寫csv示例分享
這篇文章主要介紹了JAVA對CSV格式文本數據處理后再保存成新CSV格式文本的模板,可以學習到java讀取csv文件和寫csv的方法,需要的朋友可以參考下 ...
- JAVA教程
Java8新特性之字符串去重介紹
這篇文章主要介紹了Java8新特性之字符串去重介紹,新的字符串去重特性可以幫助減少應用中String對象的內存占用,目前該特性只適用于G1垃圾收集器,并且...
- JAVA教程
Java中的關鍵字volatile詳解
這篇文章主要介紹了Java中的關鍵字volatile,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小...
- JAVA教程
淺析java貪心算法
這篇文章簡單主要介紹了java貪心算法,包含貪心算法的基本思路,性質,以及實現示例,有需要的小伙伴參考下 ...
- JAVA教程
Java冒泡排序(Bubble Sort)實例講解
冒泡排序的原理:假設要求的數組是正序,兩兩進行比較,如果前一個書比后一個數小,位置不變。如果前一個數比后一個數大,位置互換,再跟后一個數...
- JAVA教程
jdk中密鑰和證書管理工具keytool常用命令詳解
keytool JAVA是個密鑰和證書管理工具。它使用戶能夠管理自己的公鑰/私鑰對及相關證書,用于(通過數字簽名)自我認證(用戶向別的用戶/服務認證自己)...