1 packagecom.linxi.page;2
3 importjava.awt.AlphaComposite;4 importjava.awt.Color;5 importjava.awt.Font;6 importjava.awt.Graphics;7 importjava.awt.Graphics2D;8 importjava.awt.Image;9 importjava.awt.Toolkit;10 importjava.awt.color.ColorSpace;11 importjava.awt.geom.AffineTransform;12 importjava.awt.image.AffineTransformOp;13 importjava.awt.image.BufferedImage;14 importjava.awt.image.ColorConvertOp;15 importjava.awt.image.CropImageFilter;16 importjava.awt.image.FilteredImageSource;17 importjava.awt.image.ImageFilter;18 .File;19 .IOException;20
21
22 importjavax.imageio.ImageIO;23
24
25 /**
26 * 图片处理工具类:
27 * 功能:缩放图像、切割图像、图像类型转换、彩色转黑白、文字水印、图片水印等28 *@authorAdministrator29 */30 public classImageUtils {31
32
33 /**
34 * 几种常见的图片格式35 */
36 public static String IMAGE_TYPE_GIF = "gif";//图形交换格式
37 public static String IMAGE_TYPE_JPG = "jpg";//联合照片专家组
38 public static String IMAGE_TYPE_JPEG = "jpeg";//联合照片专家组
39 public static String IMAGE_TYPE_BMP = "bmp";//英文Bitmap(位图)的简写,它是Windows操作系统中的标准图像文件格式
40 public static String IMAGE_TYPE_PNG = "png";//可移植网络图形
41 public static String IMAGE_TYPE_PSD = "psd";//Photoshop的专用格式Photoshop
42
43
44 /**
45 * 程序入口:用于测试46 *@paramargs47 */
48 public static voidmain(String[] args) {49 //1-缩放图像:50 //方法一:按比例缩放
51 ImageUtils.scale("e:/abc.jpg", "e:/abc_scale.jpg", 2, true);//测试OK52 //方法二:按高度和宽度缩放
53 ImageUtils.scale2("e:/abc.jpg", "e:/abc_scale2.jpg", 500, 300, true);//测试OK54
55
56 //2-切割图像:57 //方法一:按指定起点坐标和宽高切割
58 ImageUtils.cut("e:/abc.jpg", "e:/abc_cut.jpg", 0, 0, 400, 400 );//测试OK59 //方法二:指定切片的行数和列数
60 ImageUtils.cut2("e:/abc.jpg", "e:/", 2, 2 );//测试OK61 //方法三:指定切片的宽度和高度
62 ImageUtils.cut3("e:/abc.jpg", "e:/", 300, 300 );//测试OK63
64
65 //3-图像类型转换:
66 ImageUtils.convert("e:/abc.jpg", "GIF", "e:/abc_convert.gif");//测试OK67
68
69 //4-彩色转黑白:
70 ImageUtils.gray("e:/abc.jpg", "e:/abc_gray.jpg");//测试OK71
72
73 //5-给图片添加文字水印:74 //方法一:
75 ImageUtils.pressText("我是水印文字","e:/abc.jpg","e:/abc_pressText.jpg","宋体",Font.BOLD,Color.white,80, 0, 0, 0.5f);//测试OK76 //方法二:
77 ImageUtils.pressText2("我也是水印文字", "e:/abc.jpg","e:/abc_pressText2.jpg", "黑体", 36, Color.white, 80, 0, 0, 0.5f);//测试OK78
79 //6-给图片添加图片水印:
80 ImageUtils.pressImage("e:/abc2.jpg", "e:/abc.jpg","e:/abc_pressImage.jpg", 0, 0, 0.5f);//测试OK
81 }82
83
84 /**
85 * 缩放图像(按比例缩放)86 *@paramsrcImageFile 源图像文件地址87 *@paramresult 缩放后的图像地址88 *@paramscale 缩放比例89 *@paramflag 缩放选择:true 放大; false 缩小;90 */
91 public final static voidscale(String srcImageFile, String result,92 int scale, booleanflag) {93 try{94 BufferedImage src = ImageIO.read(new File(srcImageFile)); //读入文件
95 int width = src.getWidth(); //得到源图宽
96 int height = src.getHeight(); //得到源图长
97 if (flag) {//放大
98 width = width *scale;99 height = height *scale;100 } else {//缩小
101 width = width /scale;102 height = height /scale;103 }104 Image image =src.getScaledInstance(width, height,105 Image.SCALE_DEFAULT);106 BufferedImage tag = newBufferedImage(width, height,107 BufferedImage.TYPE_INT_RGB);108 Graphics g =tag.getGraphics();109 g.drawImage(image, 0, 0, null); //绘制缩小后的图
110 g.dispose();111 ImageIO.write(tag, "JPEG", new File(result));//输出到文件流
112 } catch(IOException e) {113 e.printStackTrace();114 }115 }116
117
118 /**
119 * 缩放图像(按高度和宽度缩放)120 *@paramsrcImageFile 源图像文件地址121 *@paramresult 缩放后的图像地址122 *@paramheight 缩放后的高度123 *@paramwidth 缩放后的宽度124 *@parambb 比例不对时是否需要补白:true为补白; false为不补白;125 */
126 public final static void scale2(String srcImageFile, String result, int height, int width, booleanbb) {127 try{128 double ratio = 0.0; //缩放比例
129 File f = newFile(srcImageFile);130 BufferedImage bi =ImageIO.read(f);131 Image itemp =bi.getScaledInstance(width, height, bi.SCALE_SMOOTH);132 //计算比例
133 if ((bi.getHeight() > height) || (bi.getWidth() >width)) {134 if (bi.getHeight() >bi.getWidth()) {135 ratio = (newInteger(height)).doubleValue()136 /bi.getHeight();137 } else{138 ratio = (new Integer(width)).doubleValue() /bi.getWidth();139 }140 AffineTransformOp op = newAffineTransformOp(AffineTransform141 .getScaleInstance(ratio, ratio), null);142 itemp = op.filter(bi, null);143 }144 if (bb) {//补白
145 BufferedImage image = newBufferedImage(width, height,146 BufferedImage.TYPE_INT_RGB);147 Graphics2D g =image.createGraphics();148 g.setColor(Color.white);149 g.fillRect(0, 0, width, height);150 if (width == itemp.getWidth(null))151 g.drawImage(itemp, 0, (height - itemp.getHeight(null)) / 2,152 itemp.getWidth(null), itemp.getHeight(null),153 Color.white, null);154 else
155 g.drawImage(itemp, (width - itemp.getWidth(null)) / 2, 0,156 itemp.getWidth(null), itemp.getHeight(null),157 Color.white, null);158 g.dispose();159 itemp =image;160 }161 ImageIO.write((BufferedImage) itemp, "JPEG", newFile(result));162 } catch(IOException e) {163 e.printStackTrace();164 }165 }166
167 /**
168 * 图像切割(按指定起点坐标和宽高切割)169 *@paramsrcImageFile 源图像地址170 *@paramresult 切片后的图像地址171 *@paramx 目标切片起点坐标X172 *@paramy 目标切片起点坐标Y173 *@paramwidth 目标切片宽度174 *@paramheight 目标切片高度175 */
176 public final static voidcut(String srcImageFile, String result,177 int x, int y, int width, intheight) {178 try{179 //读取源图像
180 BufferedImage bi = ImageIO.read(newFile(srcImageFile));181 int srcWidth = bi.getHeight(); //源图宽度
182 int srcHeight = bi.getWidth(); //源图高度
183 if (srcWidth > 0 && srcHeight > 0) {184 Image image =bi.getScaledInstance(srcWidth, srcHeight,185 Image.SCALE_DEFAULT);186 //四个参数分别为图像起点坐标和宽高187 //即: CropImageFilter(int x,int y,int width,int height)
188 ImageFilter cropFilter = newCropImageFilter(x, y, width, height);189 Image img =Toolkit.getDefaultToolkit().createImage(190 newFilteredImageSource(image.getSource(),191 cropFilter));192 BufferedImage tag = newBufferedImage(width, height, BufferedImage.TYPE_INT_RGB);193 Graphics g =tag.getGraphics();194 g.drawImage(img, 0, 0, width, height, null); //绘制切割后的图
195 g.dispose();196 //输出为文件
197 ImageIO.write(tag, "JPEG", newFile(result));198 }199 } catch(Exception e) {200 e.printStackTrace();201 }202 }203
204 /**
205 * 图像切割(指定切片的行数和列数)206 *@paramsrcImageFile 源图像地址207 *@paramdescDir 切片目标文件夹208 *@paramrows 目标切片行数。默认2,必须是范围 [1, 20] 之内209 *@paramcols 目标切片列数。默认2,必须是范围 [1, 20] 之内210 */
211 public final static voidcut2(String srcImageFile, String descDir,212 int rows, intcols) {213 try{214 if(rows<=0||rows>20) rows = 2; //切片行数
215 if(cols<=0||cols>20) cols = 2; //切片列数216 //读取源图像
217 BufferedImage bi = ImageIO.read(newFile(srcImageFile));218 int srcWidth = bi.getHeight(); //源图宽度
219 int srcHeight = bi.getWidth(); //源图高度
220 if (srcWidth > 0 && srcHeight > 0) {221 Image img;222 ImageFilter cropFilter;223 Image image =bi.getScaledInstance(srcWidth, srcHeight, Image.SCALE_DEFAULT);224 int destWidth = srcWidth; //每张切片的宽度
225 int destHeight = srcHeight; //每张切片的高度226 //计算切片的宽度和高度
227 if (srcWidth % cols == 0) {228 destWidth = srcWidth /cols;229 } else{230 destWidth = (int) Math.floor(srcWidth / cols) + 1;231 }232 if (srcHeight % rows == 0) {233 destHeight = srcHeight /rows;234 } else{235 destHeight = (int) Math.floor(srcWidth / rows) + 1;236 }237 //循环建立切片238 //改进的想法:是否可用多线程加快切割速度
239 for (int i = 0; i < rows; i++) {240 for (int j = 0; j < cols; j++) {241 //四个参数分别为图像起点坐标和宽高242 //即: CropImageFilter(int x,int y,int width,int height)
243 cropFilter = new CropImageFilter(j * destWidth, i *destHeight,244 destWidth, destHeight);245 img =Toolkit.getDefaultToolkit().createImage(246 newFilteredImageSource(image.getSource(),247 cropFilter));248 BufferedImage tag = newBufferedImage(destWidth,249 destHeight, BufferedImage.TYPE_INT_RGB);250 Graphics g =tag.getGraphics();251 g.drawImage(img, 0, 0, null); //绘制缩小后的图
252 g.dispose();253 //输出为文件
254 ImageIO.write(tag, "JPEG", newFile(descDir255 + "_r" + i + "_c" + j + ".jpg"));256 }257 }258 }259 } catch(Exception e) {260 e.printStackTrace();261 }262 }263
264
265 /**
266 * 图像切割(指定切片的宽度和高度)267 *@paramsrcImageFile 源图像地址268 *@paramdescDir 切片目标文件夹269 *@paramdestWidth 目标切片宽度。默认200270 *@paramdestHeight 目标切片高度。默认150271 */
272 public final static voidcut3(String srcImageFile, String descDir,273 int destWidth, intdestHeight) {274 try{275 if(destWidth<=0) destWidth = 200; //切片宽度
276 if(destHeight<=0) destHeight = 150; //切片高度277 //读取源图像
278 BufferedImage bi = ImageIO.read(newFile(srcImageFile));279 int srcWidth = bi.getHeight(); //源图宽度
280 int srcHeight = bi.getWidth(); //源图高度
281 if (srcWidth > destWidth && srcHeight >destHeight) {282 Image img;283 ImageFilter cropFilter;284 Image image =bi.getScaledInstance(srcWidth, srcHeight, Image.SCALE_DEFAULT);285 int cols = 0; //切片横向数量
286 int rows = 0; //切片纵向数量287 //计算切片的横向和纵向数量
288 if (srcWidth % destWidth == 0) {289 cols = srcWidth /destWidth;290 } else{291 cols = (int) Math.floor(srcWidth / destWidth) + 1;292 }293 if (srcHeight % destHeight == 0) {294 rows = srcHeight /destHeight;295 } else{296 rows = (int) Math.floor(srcHeight / destHeight) + 1;297 }298 //循环建立切片299 //改进的想法:是否可用多线程加快切割速度
300 for (int i = 0; i < rows; i++) {301 for (int j = 0; j < cols; j++) {302 //四个参数分别为图像起点坐标和宽高303 //即: CropImageFilter(int x,int y,int width,int height)
304 cropFilter = new CropImageFilter(j * destWidth, i *destHeight,305 destWidth, destHeight);306 img =Toolkit.getDefaultToolkit().createImage(307 newFilteredImageSource(image.getSource(),308 cropFilter));309 BufferedImage tag = newBufferedImage(destWidth,310 destHeight, BufferedImage.TYPE_INT_RGB);311 Graphics g =tag.getGraphics();312 g.drawImage(img, 0, 0, null); //绘制缩小后的图
313 g.dispose();314 //输出为文件
315 ImageIO.write(tag, "JPEG", newFile(descDir316 + "_r" + i + "_c" + j + ".jpg"));317 }318 }319 }320 } catch(Exception e) {321 e.printStackTrace();322 }323 }324
325
326 /**
327 * 图像类型转换:GIF->JPG、GIF->PNG、PNG->JPG、PNG->GIF(X)、BMP->PNG328 *@paramsrcImageFile 源图像地址329 *@paramformatName 包含格式非正式名称的 String:如JPG、JPEG、GIF等330 *@paramdestImageFile 目标图像地址331 */
332 public final static voidconvert(String srcImageFile, String formatName, String destImageFile) {333 try{334 File f = newFile(srcImageFile);335 f.canRead();336 f.canWrite();337 BufferedImage src =ImageIO.read(f);338 ImageIO.write(src, formatName, newFile(destImageFile));339 } catch(Exception e) {340 e.printStackTrace();341 }342 }343
344
345 /**
346 * 彩色转为黑白347 *@paramsrcImageFile 源图像地址348 *@paramdestImageFile 目标图像地址349 */
350 public final static voidgray(String srcImageFile, String destImageFile) {351 try{352 BufferedImage src = ImageIO.read(newFile(srcImageFile));353 ColorSpace cs =ColorSpace.getInstance(ColorSpace.CS_GRAY);354 ColorConvertOp op = new ColorConvertOp(cs, null);355 src = op.filter(src, null);356 ImageIO.write(src, "JPEG", newFile(destImageFile));357 } catch(IOException e) {358 e.printStackTrace();359 }360 }361
362
363 /**
364 * 给图片添加文字水印365 *@parampressText 水印文字366 *@paramsrcImageFile 源图像地址367 *@paramdestImageFile 目标图像地址368 *@paramfontName 水印的字体名称369 *@paramfontStyle 水印的字体样式370 *@paramcolor 水印的字体颜色371 *@paramfontSize 水印的字体大小372 *@paramx 修正值373 *@paramy 修正值374 *@paramalpha 透明度:alpha 必须是范围 [0.0, 1.0] 之内(包含边界值)的一个浮点数字375 */
376 public final static voidpressText(String pressText,377 String srcImageFile, String destImageFile, String fontName,378 int fontStyle, Color color, int fontSize,intx,379 int y, floatalpha) {380 try{381 File img = newFile(srcImageFile);382 Image src =ImageIO.read(img);383 int width = src.getWidth(null);384 int height = src.getHeight(null);385 BufferedImage image = newBufferedImage(width, height,386 BufferedImage.TYPE_INT_RGB);387 Graphics2D g =image.createGraphics();388 g.drawImage(src, 0, 0, width, height, null);389 g.setColor(color);390 g.setFont(newFont(fontName, fontStyle, fontSize));391 g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP,392 alpha));393 //在指定坐标绘制水印文字
394 g.drawString(pressText, (width - (getLength(pressText) *fontSize))395 / 2 + x, (height - fontSize) / 2 +y);396 g.dispose();397 ImageIO.write((BufferedImage) image, "JPEG", new File(destImageFile));//输出到文件流
398 } catch(Exception e) {399 e.printStackTrace();400 }401 }402
403
404 /**
405 * 给图片添加文字水印406 *@parampressText 水印文字407 *@paramsrcImageFile 源图像地址408 *@paramdestImageFile 目标图像地址409 *@paramfontName 字体名称410 *@paramfontStyle 字体样式411 *@paramcolor 字体颜色412 *@paramfontSize 字体大小413 *@paramx 修正值414 *@paramy 修正值415 *@paramalpha 透明度:alpha 必须是范围 [0.0, 1.0] 之内(包含边界值)的一个浮点数字416 */
417 public final static voidpressText2(String pressText, String srcImageFile,String destImageFile,418 String fontName, int fontStyle, Color color, int fontSize, intx,419 int y, floatalpha) {420 try{421 File img = newFile(srcImageFile);422 Image src =ImageIO.read(img);423 int width = src.getWidth(null);424 int height = src.getHeight(null);425 BufferedImage image = newBufferedImage(width, height,426 BufferedImage.TYPE_INT_RGB);427 Graphics2D g =image.createGraphics();428 g.drawImage(src, 0, 0, width, height, null);429 g.setColor(color);430 g.setFont(newFont(fontName, fontStyle, fontSize));431 g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP,432 alpha));433 //在指定坐标绘制水印文字
434 g.drawString(pressText, (width - (getLength(pressText) *fontSize))435 / 2 + x, (height - fontSize) / 2 +y);436 g.dispose();437 ImageIO.write((BufferedImage) image, "JPEG", newFile(destImageFile));438 } catch(Exception e) {439 e.printStackTrace();440 }441 }442
443
444 /**
445 * 给图片添加图片水印446 *@parampressImg 水印图片447 *@paramsrcImageFile 源图像地址448 *@paramdestImageFile 目标图像地址449 *@paramx 修正值。 默认在中间450 *@paramy 修正值。 默认在中间451 *@paramalpha 透明度:alpha 必须是范围 [0.0, 1.0] 之内(包含边界值)的一个浮点数字452 */
453 public final static voidpressImage(String pressImg, String srcImageFile,String destImageFile,454 int x, int y, floatalpha) {455 try{456 File img = newFile(srcImageFile);457 Image src =ImageIO.read(img);458 int wideth = src.getWidth(null);459 int height = src.getHeight(null);460 BufferedImage image = newBufferedImage(wideth, height,461 BufferedImage.TYPE_INT_RGB);462 Graphics2D g =image.createGraphics();463 g.drawImage(src, 0, 0, wideth, height, null);464 //水印文件
465 Image src_biao = ImageIO.read(newFile(pressImg));466 int wideth_biao = src_biao.getWidth(null);467 int height_biao = src_biao.getHeight(null);468 g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP,469 alpha));470 g.drawImage(src_biao, (wideth - wideth_biao) / 2,471 (height - height_biao) / 2, wideth_biao, height_biao, null);472 //水印文件结束
473 g.dispose();474 ImageIO.write((BufferedImage) image, "JPEG", newFile(destImageFile));475 } catch(Exception e) {476 e.printStackTrace();477 }478 }479
480
481 /**
482 * 计算text的长度(一个中文算两个字符)483 *@paramtext484 *@return
485 */
486 public final static intgetLength(String text) {487 int length = 0;488 for (int i = 0; i < text.length(); i++) {489 if (new String(text.charAt(i) + "").getBytes().length > 1) {490 length += 2;491 } else{492 length += 1;493 }494 }495 return length / 2;496 }497 }
java 图数据计算 开源 java 图像处理 开源库
转载文章标签 java 图数据计算 开源 java图像处理特点 Image bc java 文章分类 Java 后端开发

-
github开源项目opencv图像处理 开源图像算法库
公众号ID|C
计算机视觉 opencv 人工智能 图像处理 python