java

位置:IT落伍者 >> java >> 浏览文章

java图片处理类(图片水印,图片缩放)


发布日期:2019年01月08日
 
java图片处理类(图片水印,图片缩放)

可实现以下常用功能缩放图像切割图像图像类型转换彩色转黑白文字水印图片水印等

代码如下 复制代码
import javaawtAlphaComposite;
import javaawtColor;
import javaawtFont;
import javaawtGraphics;
import javaawtGraphicsD;
import javaawtImage;
import javaawtToolkit;
import javaawtcolorColorSpace;
import javaawtgeomAffineTransform;
import javaawtimageAffineTransformOp;
import javaawtimageBufferedImage;
import javaawtimageColorConvertOp;
import javaawtimageCropImageFilter;
import javaawtimageFilteredImageSource;
import javaawtimageImageFilter;
import javaioFile;
import javaioIOException;

import javaximageioImageIO;

/**
* 图片处理工具类<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 args
*/
public static void main(String[] args) {
// 缩放图像
// 方法一按比例缩放
ImageUtilsscale("e:/abcjpg" "e:/abc_scalejpg" true);//测试OK
// 方法二按高度和宽度缩放
ImageUtilsscale("e:/abcjpg" "e:/abc_scalejpg" true);//测试OK

// 切割图像
// 方法一按指定起点坐标和宽高切割
ImageUtilscut("e:/abcjpg" "e:/abc_cutjpg" );//测试OK
// 方法二指定切片的行数和列数
ImageUtilscut("e:/abcjpg" "e:/" );//测试OK
// 方法三指定切片的宽度和高度
ImageUtilscut("e:/abcjpg" "e:/" );//测试OK

// 图像类型转换
ImageUtilsconvert("e:/abcjpg" "GIF" "e:/abc_convertgif");//测试OK

// 彩色转黑白
ImageUtilsgray("e:/abcjpg" "e:/abc_grayjpg");//测试OK

// 给图片添加文字水印
// 方法一
ImageUtilspressText("我是水印文字""e:/abcjpg""e:/abc_pressTextjpg""宋体"FontBOLDColorwhite f);//测试OK
// 方法二
ImageUtilspressText("我也是水印文字" "e:/abcjpg""e:/abc_pressTextjpg" "黑体" Colorwhite f);//测试OK

// 给图片添加图片水印
ImageUtilspressImage("e:/abcjpg" "e:/abcjpg""e:/abc_pressImagejpg" f);//测试OK
}

/**
* 缩放图像(按比例缩放)
* @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 = ImageIOread(new File(srcImageFile)); // 读入文件
int width = srcgetWidth(); // 得到源图宽
int height = srcgetHeight(); // 得到源图长
if (flag) {// 放大
width = width * scale;
height = height * scale;
} else {// 缩小
width = width / scale;
height = height / scale;
}
Image image = srcgetScaledInstance(width height
ImageSCALE_DEFAULT);
BufferedImage tag = new BufferedImage(width height
BufferedImageTYPE_INT_RGB);
Graphics g = taggetGraphics();
gdrawImage(image null); // 绘制缩小后的图
gdispose();
ImageIOwrite(tag "JPEG" new File(result));// 输出到文件流
} catch (IOException e) {
eprintStackTrace();
}
}

/**
* 缩放图像(按高度和宽度缩放)
* @param srcImageFile 源图像文件地址
* @param result 缩放后的图像地址
* @param height 缩放后的高度
* @param width 缩放后的宽度
* @param bb 比例不对时是否需要补白true为补白; false为不补白;
*/
public final static void scale(String srcImageFile String result int height int width boolean bb) {
try {
double ratio = ; // 缩放比例
File f = new File(srcImageFile);
BufferedImage bi = ImageIOread(f);
Image itemp = bigetScaledInstance(width height biSCALE_SMOOTH);
// 计算比例
if ((bigetHeight() > height) || (bigetWidth() > width)) {
if (bigetHeight() > bigetWidth()) {
ratio = (new Integer(height))doubleValue()
/ bigetHeight();
} else {
ratio = (new Integer(width))doubleValue() / bigetWidth();
}
AffineTransformOp op = new AffineTransformOp(AffineTransform
getScaleInstance(ratio ratio) null);
itemp = opfilter(bi null);
}
if (bb) {//补白
BufferedImage image = new BufferedImage(width height
BufferedImageTYPE_INT_RGB);
GraphicsD g = imagecreateGraphics();
gsetColor(Colorwhite);
gfillRect( width height);
if (width == itempgetWidth(null))
gdrawImage(itemp (height itempgetHeight(null)) /
itempgetWidth(null) itempgetHeight(null)
Colorwhite null);
else
gdrawImage(itemp (width itempgetWidth(null)) /
itempgetWidth(null) itempgetHeight(null)
Colorwhite null);
gdispose();
itemp = image;
}
ImageIOwrite((BufferedImage) itemp "JPEG" new File(result));
} catch (IOException e) {
eprintStackTrace();
}
}

/**
* 图像切割(按指定起点坐标和宽高切割)
* @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 = ImageIOread(new File(srcImageFile));
int srcWidth = bigetHeight(); // 源图宽度
int srcHeight = bigetWidth(); // 源图高度
if (srcWidth > && srcHeight > ) {
Image image = bigetScaledInstance(srcWidth srcHeight
ImageSCALE_DEFAULT);
// 四个参数分别为图像起点坐标和宽高
// 即: CropImageFilter(int xint yint widthint height)
ImageFilter cropFilter = new CropImageFilter(x y width height);
Image img = ToolkitgetDefaultToolkit()createImage(
new FilteredImageSource(imagegetSource()
cropFilter));
BufferedImage tag = new BufferedImage(width height BufferedImageTYPE_INT_RGB);
Graphics g = taggetGraphics();
gdrawImage(img width height null); // 绘制切割后的图
gdispose();
// 输出为文件
ImageIOwrite(tag "JPEG" new File(result));
}
} catch (Exception e) {
eprintStackTrace();
}
}

/**
* 图像切割(指定切片的行数和列数)
* @param srcImageFile 源图像地址
* @param descDir 切片目标文件夹
* @param rows 目标切片行数默认必须是范围 [ ] 之内
* @param cols 目标切片列数默认必须是范围 [ ] 之内
*/
public final static void cut(String srcImageFile String descDir
int rows int cols) {
try {
if(rows<=||rows>) rows = ; // 切片行数
if(cols<=||cols>) cols = ; // 切片列数
// 读取源图像
BufferedImage bi = ImageIOread(new File(srcImageFile));
int srcWidth = bigetHeight(); // 源图宽度
int srcHeight = bigetWidth(); // 源图高度
if (srcWidth > && srcHeight > ) {
Image img;
ImageFilter cropFilter;
Image image = bigetScaledInstance(srcWidth srcHeight ImageSCALE_DEFAULT);
int destWidth = srcWidth; // 每张切片的宽度
int destHeight = srcHeight; // 每张切片的高度
// 计算切片的宽度和高度
if (srcWidth % cols == ) {
destWidth = srcWidth / cols;
} else {
destWidth = (int) Mathfloor(srcWidth / cols) + ;
}
if (srcHeight % rows == ) {
destHeight = srcHeight / rows;
} else {
destHeight = (int) Mathfloor(srcWidth / rows) + ;
}
// 循环建立切片
// 改进的想法:是否可用多线程加快切割速度
for (int i = ; i < rows; i++) {
for (int j = ; j < cols; j++) {
// 四个参数分别为图像起点坐标和宽高
// 即: CropImageFilter(int xint yint widthint height)
cropFilter = new CropImageFilter(j * destWidth i * destHeight
destWidth destHeight);
img = ToolkitgetDefaultToolkit()createImage(
new FilteredImageSource(imagegetSource()
cropFilter));
BufferedImage tag = new BufferedImage(destWidth
destHeight BufferedImageTYPE_INT_RGB);
Graphics g = taggetGraphics();
gdrawImage(img null); // 绘制缩小后的图
gdispose();
// 输出为文件
ImageIOwrite(tag "JPEG" new File(descDir
+ "_r" + i + "_c" + j + "jpg"));
}
}
}
} catch (Exception e) {
eprintStackTrace();
}
}

/**
* 图像切割(指定切片的宽度和高度)
* @param srcImageFile 源图像地址
* @param descDir 切片目标文件夹
* @param destWidth 目标切片宽度默认
* @param destHeight 目标切片高度默认
*/
public final static void cut(String srcImageFile String descDir
int destWidth int destHeight) {
try {
if(destWidth<=) destWidth = ; // 切片宽度
if(destHeight<=) destHeight = ; // 切片高度
// 读取源图像
BufferedImage bi = ImageIOread(new File(srcImageFile));
int srcWidth = bigetHeight(); // 源图宽度
int srcHeight = bigetWidth(); // 源图高度
if (srcWidth > destWidth && srcHeight > destHeight) {
Image img;
ImageFilter cropFilter;
Image image = bigetScaledInstance(srcWidth srcHeight ImageSCALE_DEFAULT);
int cols = ; // 切片横向数量
int rows = ; // 切片纵向数量
// 计算切片的横向和纵向数量
if (srcWidth % destWidth == ) {
cols = srcWidth / destWidth;
} else {
cols = (int) Mathfloor(srcWidth / destWidth) + ;
}
if (srcHeight % destHeight == ) {
rows = srcHeight / destHeight;
} else {
rows = (int) Mathfloor(srcHeight / destHeight) + ;
}
// 循环建立切片
// 改进的想法:是否可用多线程加快切割速度
for (int i = ; i < rows; i++) {
for (int j = ; j < cols; j++) {
// 四个参数分别为图像起点坐标和宽高
// 即: CropImageFilter(int xint yint widthint height)
cropFilter = new CropImageFilter(j * destWidth i * destHeight
destWidth destHeight);
img = ToolkitgetDefaultToolkit()createImage(
new FilteredImageSource(imagegetSource()
cropFilter));
BufferedImage tag = new BufferedImage(destWidth
destHeight BufferedImageTYPE_INT_RGB);
Graphics g = taggetGraphics();
gdrawImage(img null); // 绘制缩小后的图
gdispose();
// 输出为文件
ImageIOwrite(tag "JPEG" new File(descDir
+ "_r" + i + "_c" + j + "jpg"));
}
}
}
} catch (Exception e) {
eprintStackTrace();
}
}

/**
* 图像类型转换GIF>JPGGIF>PNGPNG>JPGPNG>GIF(X)BMP>PNG
* @param srcImageFile 源图像地址
* @param formatName 包含格式非正式名称的 String如JPGJPEGGIF等
* @param destImageFile 目标图像地址
*/
public final static void convert(String srcImageFile String formatName String destImageFile) {
try {
File f = new File(srcImageFile);
fcanRead();
fcanWrite();
BufferedImage src = ImageIOread(f);
ImageIOwrite(src formatName new File(destImageFile));
} catch (Exception e) {
eprintStackTrace();
}
}

/**
* 彩色转为黑白
* @param srcImageFile 源图像地址
* @param destImageFile 目标图像地址
*/
public final static void gray(String srcImageFile String destImageFile) {
try {
BufferedImage src = ImageIOread(new File(srcImageFile));
ColorSpace cs = ColorSpacegetInstance(ColorSpaceCS_GRAY);
ColorConvertOp op = new ColorConvertOp(cs null);
src = opfilter(src null);
ImageIOwrite(src "JPEG" new File(destImageFile));
} catch (IOException e) {
eprintStackTrace();
}
}

/**
* 给图片添加文字水印
* @param pressText 水印文字
* @param srcImageFile 源图像地址
* @param destImageFile 目标图像地址
* @param fontName 水印的字体名称
* @param fontStyle 水印的字体样式
* @param color 水印的字体颜色
* @param fontSize 水印的字体大小
* @param x 修正值
* @param y 修正值
* @param alpha 透明度alpha 必须是范围 [ ] 之内(包含边界值)的一个浮点数字
*/
public final static void pressText(String pressText
String srcImageFile String destImageFile String fontName
int fontStyle Color color int fontSizeint x
int y float alpha) {
try {
File img = new File(srcImageFile);
Image src = ImageIOread(img);
int width = srcgetWidth(null);
int height = srcgetHeight(null);
BufferedImage image = new BufferedImage(width height
BufferedImageTYPE_INT_RGB);
GraphicsD g = imagecreateGraphics();
gdrawImage(src width height null);
gsetColor(color);
gsetFont(new Font(fontName fontStyle fontSize));
gsetComposite(AlphaCompositegetInstance(AlphaCompositeSRC_ATOP
alpha));
// 在指定坐标绘制水印文字
gdrawString(pressText (width (getLength(pressText) * fontSize))
/ + x (height fontSize) / + y);
gdispose();
ImageIOwrite((BufferedImage) image "JPEG" new File(destImageFile));// 输出到文件流
} catch (Exception e) {
eprintStackTrace();
}
}

/**
* 给图片添加文字水印
* @param pressText 水印文字
* @param srcImageFile 源图像地址
* @param destImageFile 目标图像地址
* @param fontName 字体名称
* @param fontStyle 字体样式
* @param color 字体颜色
* @param fontSize 字体大小
* @param x 修正值
* @param y 修正值
* @param alpha 透明度alpha 必须是范围 [ ] 之内(包含边界值)的一个浮点数字
*/
public final static void pressText(String pressText String srcImageFileString destImageFile
String fontName int fontStyle Color color int fontSize int x
int y float alpha) {
try {
File img = new File(srcImageFile);
Image src = ImageIOread(img);
int width = srcgetWidth(null);
int height = srcgetHeight(null);
BufferedImage image = new BufferedImage(width height
BufferedImageTYPE_INT_RGB);
GraphicsD g = imagecreateGraphics();
gdrawImage(src width height null);
gsetColor(color);
gsetFont(new Font(fontName fontStyle fontSize));
gsetComposite(AlphaCompositegetInstance(AlphaCompositeSRC_ATOP
alpha));
// 在指定坐标绘制水印文字
gdrawString(pressText (width (getLength(pressText) * fontSize))
/ + x (height fontSize) / + y);
gdispose();
ImageIOwrite((BufferedImage) image "JPEG" new File(destImageFile));
} catch (Exception e) {
eprintStackTrace();
}
}

/**
* 给图片添加图片水印
* @param pressImg 水印图片
* @param srcImageFile 源图像地址
* @param destImageFile 目标图像地址
* @param x 修正值 默认在中间
* @param y 修正值 默认在中间
* @param alpha 透明度alpha 必须是范围 [ ] 之内(包含边界值)的一个浮点数字
*/
public final static void pressImage(String pressImg String srcImageFileString destImageFile
int x int y float alpha) {
try {
File img = new File(srcImageFile);
Image src = ImageIOread(img);
int wideth = srcgetWidth(null);
int height = srcgetHeight(null);
BufferedImage image = new BufferedImage(wideth height
BufferedImageTYPE_INT_RGB);
GraphicsD g = imagecreateGraphics();
gdrawImage(src wideth height null);
// 水印文件
Image src_biao = ImageIOread(new File(pressImg));
int wideth_biao = src_biaogetWidth(null);
int height_biao = src_biaogetHeight(null);
gsetComposite(AlphaCompositegetInstance(AlphaCompositeSRC_ATOP
alpha));
gdrawImage(src_biao (wideth wideth_biao) /
(height height_biao) / wideth_biao height_biao null);
// 水印文件结束
gdispose();
ImageIOwrite((BufferedImage) image "JPEG" new File(destImageFile));
} catch (Exception e) {
eprintStackTrace();
}
}

/**
* 计算text的长度(一个中文算两个字符)
* @param text
* @return
*/
public final static int getLength(String text) {
int length = ;
for (int i = ; i < textlength(); i++) {
if (new String(textcharAt(i) + "")getBytes()length > ) {
length += ;
} else {
length += ;
}
}
return length / ;
}
}

               

上一篇:Java for循环语句使用

下一篇:java获得字符串间运算符变量的值