直接上代码:

package com.zxd.tool;/*** Created by zhang on 14-3-1.* 图片的常用操作类*/import java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.color.ColorSpace;
import java.awt.geom.AffineTransform;
import java.awt.image.AffineTransformOp;
import java.awt.image.BufferedImage;
import java.awt.image.ColorConvertOp;
import java.awt.image.CropImageFilter;
import java.awt.image.FilteredImageSource;
import java.awt.image.ImageFilter;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;/*** 图片处理工具类:<br>* 功能:缩放图像、切割图像、图像类型转换、彩色转黑白、文字水印、图片水印等** @author Administrator*/
public class ImageUtils {/*** 几种常见的图片格式*/public static String IMAGE_TYPE_GIF = "gif";// 图形交换格式public static String IMAGE_TYPE_JPG = "jpg";// 联合照片专家组public static String IMAGE_TYPE_JPEG = "jpeg";// 联合照片专家组public static String IMAGE_TYPE_BMP = "bmp";// 英文Bitmap(位图)的简写,它是Windows操作系统中的标准图像文件格式public static String IMAGE_TYPE_PNG = "png";// 可移植网络图形public static String IMAGE_TYPE_PSD = "psd";// Photoshop的专用格式Photoshop/*** 缩放图像(按比例缩放)** @param srcImageFile 源图像文件地址(绝对路径)* @param result       缩放后的图像地址(绝对路径)* @param scale        缩放比例* @param flag         缩放选择:true 放大; false 缩小;*/public final static void scale(String srcImageFile, String result,int scale, boolean flag) {try {BufferedImage src = ImageIO.read(new File(srcImageFile)); // 读入文件int width = src.getWidth(); // 得到源图宽int height = src.getHeight(); // 得到源图长if (flag) {// 放大width = width * scale;height = height * scale;} else {// 缩小width = width / scale;height = height / scale;}Image image = src.getScaledInstance(width, height,Image.SCALE_DEFAULT);BufferedImage tag = new BufferedImage(width, height,BufferedImage.TYPE_INT_RGB);Graphics g = tag.getGraphics();g.drawImage(image, 0, 0, null); // 绘制缩小后的图
            g.dispose();ImageIO.write(tag, "JPEG", new File(result));// 输出到文件流} catch (IOException e) {e.printStackTrace();}}/*** 缩放图像(按高度和宽度缩放)** @param srcImageFile 源图像文件地址(绝对路径)* @param result       缩放后的图像地址(绝对路径)* @param height       缩放后的高度* @param width        缩放后的宽度* @param bb           比例不对时是否需要补白:true为补白; false为不补白;*/public final static void scale2(String srcImageFile, String result, int height, int width, boolean bb) {try {double ratio = 0.0; // 缩放比例File f = new File(srcImageFile);BufferedImage bi = ImageIO.read(f);Image itemp = bi.getScaledInstance(width, height, bi.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);elseg.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, "JPEG", new File(result));} catch (IOException e) {e.printStackTrace();}}/*** 图像切割(按指定起点坐标和宽高切割)** @param srcImageFile 源图像地址 (绝对路径)* @param result       切片后的图像地址 (绝对路径)* @param x            目标切片起点坐标X* @param y            目标切片起点坐标Y* @param width        目标切片宽度* @param height       目标切片高度*/public final static void cut(String srcImageFile, String result,int x, int y, int width, int height) {try {// 读取源图像BufferedImage bi = ImageIO.read(new File(srcImageFile));int srcWidth = bi.getHeight(); // 源图宽度int srcHeight = bi.getWidth(); // 源图高度if (srcWidth > 0 && srcHeight > 0) {Image image = bi.getScaledInstance(srcWidth, srcHeight,Image.SCALE_DEFAULT);// 四个参数分别为图像起点坐标和宽高// 即: CropImageFilter(int x,int y,int width,int height)ImageFilter cropFilter = new CropImageFilter(x, y, width, height);Image img = Toolkit.getDefaultToolkit().createImage(new FilteredImageSource(image.getSource(),cropFilter));BufferedImage tag = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);Graphics g = tag.getGraphics();g.drawImage(img, 0, 0, width, height, null); // 绘制切割后的图
                g.dispose();// 输出为文件ImageIO.write(tag, "JPEG", new File(result));}} catch (Exception e) {e.printStackTrace();}}/*** 图像切割(指定切片的行数和列数)** @param srcImageFile 源图像地址 (绝对路径)* @param descDir      切片目标文件夹* @param rows         目标切片行数。默认2,必须是范围 [1, 20] 之内* @param cols         目标切片列数。默认2,必须是范围 [1, 20] 之内*/public final static void cut2(String srcImageFile, String descDir,int rows, int cols) {try {if (rows <= 0 || rows > 20) rows = 2; // 切片行数if (cols <= 0 || cols > 20) cols = 2; // 切片列数// 读取源图像BufferedImage bi = ImageIO.read(new File(srcImageFile));int srcWidth = bi.getHeight(); // 源图宽度int srcHeight = bi.getWidth(); // 源图高度if (srcWidth > 0 && srcHeight > 0) {Image img;ImageFilter cropFilter;Image image = bi.getScaledInstance(srcWidth, srcHeight, Image.SCALE_DEFAULT);int destWidth = srcWidth; // 每张切片的宽度int destHeight = srcHeight; // 每张切片的高度// 计算切片的宽度和高度if (srcWidth % cols == 0) {destWidth = srcWidth / cols;} else {destWidth = (int) Math.floor(srcWidth / cols) + 1;}if (srcHeight % rows == 0) {destHeight = srcHeight / rows;} else {destHeight = (int) Math.floor(srcWidth / rows) + 1;}// 循环建立切片// 改进的想法:是否可用多线程加快切割速度for (int i = 0; i < rows; i++) {for (int j = 0; j < cols; j++) {// 四个参数分别为图像起点坐标和宽高// 即: CropImageFilter(int x,int y,int width,int height)cropFilter = new CropImageFilter(j * destWidth, i * destHeight,destWidth, destHeight);img = Toolkit.getDefaultToolkit().createImage(new FilteredImageSource(image.getSource(),cropFilter));BufferedImage tag = new BufferedImage(destWidth,destHeight, BufferedImage.TYPE_INT_RGB);Graphics g = tag.getGraphics();g.drawImage(img, 0, 0, null); // 绘制缩小后的图
                        g.dispose();// 输出为文件ImageIO.write(tag, "JPEG", new File(descDir+ "_r" + i + "_c" + j + ".jpg"));}}}} catch (Exception e) {e.printStackTrace();}}/*** 图像切割(指定切片的宽度和高度)** @param srcImageFile 源图像地址 (绝对路径)* @param descDir      切片目标文件夹* @param destWidth    目标切片宽度。默认200* @param destHeight   目标切片高度。默认150*/public final static void cut3(String srcImageFile, String descDir,int destWidth, int destHeight) {try {if (destWidth <= 0) destWidth = 200; // 切片宽度if (destHeight <= 0) destHeight = 150; // 切片高度// 读取源图像BufferedImage bi = ImageIO.read(new File(srcImageFile));int srcWidth = bi.getHeight(); // 源图宽度int srcHeight = bi.getWidth(); // 源图高度if (srcWidth > destWidth && srcHeight > destHeight) {Image img;ImageFilter cropFilter;Image image = bi.getScaledInstance(srcWidth, srcHeight, Image.SCALE_DEFAULT);int cols = 0; // 切片横向数量int rows = 0; // 切片纵向数量// 计算切片的横向和纵向数量if (srcWidth % destWidth == 0) {cols = srcWidth / destWidth;} else {cols = (int) Math.floor(srcWidth / destWidth) + 1;}if (srcHeight % destHeight == 0) {rows = srcHeight / destHeight;} else {rows = (int) Math.floor(srcHeight / destHeight) + 1;}// 循环建立切片// 改进的想法:是否可用多线程加快切割速度for (int i = 0; i < rows; i++) {for (int j = 0; j < cols; j++) {// 四个参数分别为图像起点坐标和宽高// 即: CropImageFilter(int x,int y,int width,int height)cropFilter = new CropImageFilter(j * destWidth, i * destHeight,destWidth, destHeight);img = Toolkit.getDefaultToolkit().createImage(new FilteredImageSource(image.getSource(),cropFilter));BufferedImage tag = new BufferedImage(destWidth,destHeight, BufferedImage.TYPE_INT_RGB);Graphics g = tag.getGraphics();g.drawImage(img, 0, 0, null); // 绘制缩小后的图
                        g.dispose();// 输出为文件ImageIO.write(tag, "JPEG", new File(descDir+ "_r" + i + "_c" + j + ".jpg"));}}}} catch (Exception e) {e.printStackTrace();}}/*** 图像类型转换:GIF->JPG、GIF->PNG、PNG->JPG、PNG->GIF(X)、BMP->PNG** @param srcImageFile  源图像地址 (绝对路径)* @param formatName    包含格式非正式名称的 String:如JPG、JPEG、GIF等* @param destImageFile 目标图像地址 (绝对路径)*/public final static void convert(String srcImageFile, String formatName, String destImageFile) {try {File f = new File(srcImageFile);f.canRead();f.canWrite();BufferedImage src = ImageIO.read(f);ImageIO.write(src, formatName, new File(destImageFile));} catch (Exception e) {e.printStackTrace();}}/*** 彩色转为黑白** @param srcImageFile  源图像地址 (绝对路径)* @param destImageFile 目标图像地址 (绝对路径)*/public final static void gray(String srcImageFile, String destImageFile) {try {BufferedImage src = ImageIO.read(new File(srcImageFile));ColorSpace cs = ColorSpace.getInstance(ColorSpace.CS_GRAY);ColorConvertOp op = new ColorConvertOp(cs, null);src = op.filter(src, null);ImageIO.write(src, "JPEG", new File(destImageFile));} catch (IOException e) {e.printStackTrace();}}/*** 给图片添加文字水印** @param pressText     水印文字* @param srcImageFile  源图像地址 (绝对路径)* @param destImageFile 目标图像地址 (绝对路径)* @param fontName      水印的字体名称* @param fontStyle     水印的字体样式* @param color         水印的字体颜色* @param fontSize      水印的字体大小* @param x             修正值* @param y             修正值* @param alpha         透明度:alpha 必须是范围 [0.0, 1.0] 之内(包含边界值)的一个浮点数字*/public final static void pressText(String pressText,String srcImageFile, String destImageFile, String fontName,int fontStyle, Color color, int fontSize, int x,int y, float alpha) {try {File img = new File(srcImageFile);Image src = ImageIO.read(img);int width = src.getWidth(null);int height = src.getHeight(null);BufferedImage image = new BufferedImage(width, height,BufferedImage.TYPE_INT_RGB);Graphics2D g = image.createGraphics();g.drawImage(src, 0, 0, width, height, null);g.setColor(color);g.setFont(new Font(fontName, fontStyle, fontSize));g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP,alpha));// 在指定坐标绘制水印文字g.drawString(pressText, (width - (getLength(pressText) * fontSize))/ 2 + x, (height - fontSize) / 2 + y);g.dispose();ImageIO.write((BufferedImage) image, "JPEG", new File(destImageFile));// 输出到文件流} catch (Exception e) {e.printStackTrace();}}/*** 给图片添加文字水印** @param pressText     水印文字* @param srcImageFile  源图像地址 (绝对路径)* @param destImageFile 目标图像地址 (绝对路径)* @param fontName      字体名称* @param fontStyle     字体样式* @param color         字体颜色* @param fontSize      字体大小* @param x             修正值* @param y             修正值* @param alpha         透明度:alpha 必须是范围 [0.0, 1.0] 之内(包含边界值)的一个浮点数字*/public final static void pressText2(String pressText, String srcImageFile, String destImageFile,String fontName, int fontStyle, Color color, int fontSize, int x,int y, float alpha) {try {File img = new File(srcImageFile);Image src = ImageIO.read(img);int width = src.getWidth(null);int height = src.getHeight(null);BufferedImage image = new BufferedImage(width, height,BufferedImage.TYPE_INT_RGB);Graphics2D g = image.createGraphics();g.drawImage(src, 0, 0, width, height, null);g.setColor(color);g.setFont(new Font(fontName, fontStyle, fontSize));g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP,alpha));// 在指定坐标绘制水印文字g.drawString(pressText, (width - (getLength(pressText) * fontSize))/ 2 + x, (height - fontSize) / 2 + y);g.dispose();ImageIO.write((BufferedImage) image, "JPEG", new File(destImageFile));} catch (Exception e) {e.printStackTrace();}}/*** 给图片添加图片水印** @param pressImg      水印图片 (绝对路径)* @param srcImageFile  源图像地址 (绝对路径)* @param destImageFile 目标图像地址 (绝对路径)* @param x             修正值。 默认在中间* @param y             修正值。 默认在中间* @param alpha         透明度:alpha 必须是范围 [0.0, 1.0] 之内(包含边界值)的一个浮点数字*/public final static void pressImage(String pressImg, String srcImageFile, String destImageFile,int x, int y, float alpha) {try {File img = new File(srcImageFile);Image src = ImageIO.read(img);int wideth = src.getWidth(null);int height = src.getHeight(null);BufferedImage image = new BufferedImage(wideth, height,BufferedImage.TYPE_INT_RGB);Graphics2D g = image.createGraphics();g.drawImage(src, 0, 0, wideth, height, null);// 水印文件Image src_biao = ImageIO.read(new File(pressImg));int wideth_biao = src_biao.getWidth(null);int height_biao = src_biao.getHeight(null);g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP,alpha));g.drawImage(src_biao, (wideth - wideth_biao) / 2,(height - height_biao) / 2, wideth_biao, height_biao, null);// 水印文件结束
            g.dispose();ImageIO.write((BufferedImage) image, "JPEG", new File(destImageFile));} catch (Exception e) {e.printStackTrace();}}/*** 计算text的长度(一个中文算两个字符)** @param text* @return*/public final static int getLength(String text) {int length = 0;for (int i = 0; i < text.length(); i++) {if (new String(text.charAt(i) + "").getBytes().length > 1) {length += 2;} else {length += 1;}}return length / 2;}
}

转载于:https://www.cnblogs.com/zxdBlog/p/3580361.html

java图片处理工具类相关推荐

  1. java 图片image工具类,ImageUtil.java

    1.java 图片image工具类,ImageUtil.java package com.broadway.numpeople.utils;import java.awt.Color; import ...

  2. java 图片合成 工具类_Java实现的微信图片处理工具类【裁剪,合并,等比例缩放等】...

    本文实例讲述了Java实现的微信图片处理工具类.分享给大家供大家参考,具体如下: 现在 外面核心,图片文章比较少,看了拷贝代码,而用不了,用相应jar包处理,很多等比例缩放,达不到 想要的给予的期望: ...

  3. java图片处理工具类,很实用哦

    笔者以前在项目里要求处理图片,当时在博客里看到这篇不错的帖子,但是没有看到原作的出处,于是就不客气的转载下来了...同时感谢原创写出这么好的东西. 这个图像工具类可实现以下常用功能:缩放图像.切割图像 ...

  4. java 图片合成 工具类_Java实现的图片上传工具类完整实例

    本文实例讲述了Java实现的图片上传工具类.分享给大家供大家参考,具体如下: package com.gcloud.common; import javax.imageio.ImageIO; impo ...

  5. java 图片合成 工具类_Java图片合成工具类

    importjava.awt.Color;importjava.awt.Graphics2D;importjava.awt.image.BufferedImage;importjava.io.File ...

  6. 海报绘制 - Java 贴图 - Java 图片绘制工具类

    package tools.io;import lombok.AllArgsConstructor; import lombok.Getter;import javax.imageio.ImageIO ...

  7. 图片处理工具类 - ImageUtils.java

    纯JAVA实现的图片处理工具类,提供图片的裁剪.压缩.获取尺寸.制作圆角等方法. 源码如下:(点击下载 -ImageUtils.java .FolderUtils.java .commons-io-2 ...

  8. Java 上传图片至OSS并返回图片地址工具类可直接用

    OSS上传图片并返回图片地址工具类 OSS上传图片并且返回地址工具类 可以直接拿去用 后续会继续更新 需要注意的点: 下面代码里的@Value里的几个值我是放在application.yml文件里的, ...

  9. Java实现pdf转图片的工具类(三种方法实现PDF转图片的案例)【亲测可用】

    提示:有些时候我们需要在项目中展示PDF,所以我们可以将PDF转为图片,然后已图片的方式展示,效果很好.Java使用各种技术将pdf转换成图片格式,并且内容不失帧.清晰可见,该工具类也是开发中常用到的 ...

  10. Java实现图片水印工具类

    一 点睛 给图片加水印是一种常见的防伪技术,在此提供一个图片水印工具类. 二 代码 package com.imooc.demo.common.util;import javax.imageio.Im ...

最新文章

  1. Oracle闪回技术(笔记)
  2. HTTP协议SSL协议HTTPS协议
  3. PHP算法根据周数获取开始结束日期
  4. 通过IGRP路由协议实现非等值带宽的负载平衡
  5. 在python中使用grpc和protobuf
  6. java方法报错_.setUndecorated 方法报错
  7. 自建Hive数据仓库跨版本迁移到阿里云E-MapReduce
  8. 一个程序员的逗逼瞬间(四)
  9. 一个函数统一238个机器学习R包,这也太赞了吧
  10. velodyne显示点云中grid的单位_孝感好的舞台背景显示屏施工创新服务_胜辉屏安...
  11. mpc 安全多方计算协议_HashKey:说透安全多方计算 MPC 技术方案、挑战与未来
  12. 机器人动力学与控制学习笔记(十一)————机器人凯恩方程动力学建模
  13. 计算机论文格式要求吗,计算机论文格式(写作要求详细介绍)
  14. 央视《家有妙招》整理版,值得永远收藏!
  15. 第十一节:抽象类和接口【java】
  16. 无头像不社交:浅析“头像设置”功能
  17. AQS抽象队列同步器
  18. java实现电子签名技术_h5实现电子签名
  19. pandas文件保存操作
  20. frp内网穿透入门级木马上线实践

热门文章

  1. 第2章 创建你的第一个 LISP 程序 Creating Your First Lisp Progr
  2. ubuntu 启动进入initramfs错误解决办法
  3. zz Makefile学习教程: 跟我一起写 Makefile
  4. Qt5学习笔记之QQ登录界面四:界面布局
  5. 洛谷 p1434 滑雪【记忆化搜索】
  6. 如何在服务器中安装mysql 以及安装禅道
  7. Python基础七(深浅copy以及int,str,tuple,list,dic补充)
  8. [JZOJ P1327] [DP]订货
  9. 火车站(codevs 2287)
  10. Putty密钥(PrivateKey)导入SecureCRT