可實現以下常用功能:縮放影像、切割影像、影像類型轉換、彩色轉黑白、文字浮水印、圖片浮水印等
程式碼如下複製程式碼
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. .image.ImageFilter;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
/**
* 圖片處理工具類別:
* 功能:縮放影像、切割影像、影像類型轉換、彩色轉黑白、文字浮水印、圖片浮水印等
* @author Administrator
*/
public class ImageUtils {
/**
* 幾種常見的圖片格式
*/
public static String IMAGE_TYPE_GIF = "gif";// 圖形交換格式
public staticic ";// 組合照片專家小組
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的專用格式Photoshop
* 程序入口:用於測試
* @param args
*/
public static void main(String[] args) {
// 1-縮放影像:## .scale("e:/abc.jpg", "e:/abc_scale.jpg", 2, true);//測試OK
// 方法二:依高度及寬度縮放-# "e:/abc.jpg", "e:/abc_scale2.jpg", 500, 300, true);//測試OK
// 2-切割影像:
按指定起點座標和寬高切割
ImageUtils.cut("e:/abc.jpg", "e:/abc_cut.jpg", 0, 0, 400, 400 );//測試OK# / 方法二:指定切片的行數和列數
:指定切片的寬度與高度
ImageUtils.cut3("e:/abc.jpg", "e:/", 300, 300 );//測試OK
## 轉換:
ImageUtils.convert("e:/abc.jpg", "GIF", "e:/abc_convert.gif");//測試轉頁
ImageUtils.gray("e:/abc.jpg", "e:/abc_gray.jpg");//測試OK
/ 方法一:
ImageUtils.pressText("我是浮水印文字","e:/abc.jpg","e:/abc_pressText.jpg","宋體",Font.BOLD,Color.white,80, 0, 0, 0.5f);//測試OK
ImageUtils.pressText2("我也是浮水印文字", "e:/abc.jpg","e:/abg_press ", "黑體", 36, Color.white, 80, 0, 0, 0.5f);//測試OK
# }
/**
* 縮放圖像(按比例縮放)
* 縮放影像(按比例縮放)
* @param srcImageFile 來源影像檔案位址
* @param result 縮放後的影像 縮放選擇:true 放大; false 縮小;
*/
public final static void scale(String srcImageFile, String result,
BufferedImage src = ImageIO.read (新檔案(srcImageFile)); // 讀入檔案
int width = src.getWidth(); // 取得來源圖寬
int height = src.getHeight(); // 取得來源圖長
if (flag) {// 放大
height * scale;
} else {// 縮小
width = widthth = widthth / 比例;
高度= 高度/ 比例;
Image.SCALE_DEFAULT);
高度,
BufferedImage.TYPE_INT_RGB);
g.drawImage(image, 0, 0, null); // 縮小後的圖片
g.dispose();
g.dispose();
原始的{
e.printStackTrace();
}
}
#
/**
* 縮放影像(以高度和寬度縮放)
* @param srcImageFile 來源影像檔案位址
* @param result 縮放後的影像位址## . * @param width 縮放後的寬度
* @param bb 比例不對時是否需要補白:true為補白; false為不補白;
*/
public final static void scale2(String srcImageFile, String result, int height, int width, boolean = 0.0; // 縮放比例
File f = new File(srcImageFile);
getScaledInstance(width, height, bi.SCALE_SMOOTH);
// 計算比例
if ((bi.getHeight() > height .getHeight() > bi.getWidth( )) {
比率= (new Integer(height)).doubleValue()
ight();
} else {
getWidth();
}
.getScaleInstance(比率與比率), null);
if (bb) {//補白
BufferedImage ) BufferedImage.TYPE_INT_RGB);
(Color.white);
g.fillRect(0, 0, 寬度, 高度);
g.drawImage(itemp, 0, (高度- itemp.getHeight(null)) / 2,
itemp.getWidth(null), itemp.getHeight(null),
Color.white, null);
else
g .drawImage(itemp , (width - itemp.getWidth(null)) / 2, 0,
Color.white, null);
g.dispose();
itemp = image;
new File(結果));
} catch (IOException e) {
e.printStackTrace();
}
}
## ,
int x, int y, int width, int height) {
try {
// );
int srcWidth = bi .getHeight(); // 源圖寬度
int srcHeight = bi.getWidth(); // 源圖高度
if (srcWidth > 0 && srcHeight > 0) {
Image.SCALE_DEFAULT);
為影像起點座標與寬高
//即: CropImageFilter(int x,int y,int width,int height)## , y, width, height);
Image img = Toolkit.getDefaultToolkit().createImage(
new Fil cropFilter));
BufferedImage 標記圖形g = tag.getGraphics();
g.drawImage(img, 0, 0, 寬度, 高度, null); // 高精準度切割後的圖片
.write(tag, "JPEG", new File(result));
}
} catch (Exception e) {
e.printStackTrace();
指定切片的行數和列數)
* @param srcImageFile 來源影像位址
* @param descDir 切片目標資料夾
* @param rows 目標切片行數。 * @param cols 目標切片列數。預設2,必須是範圍[1, 20] 之內
*/
public final static void cut2(String srcImageFile, String descDir,
try {
if(rows<=0||rows>20) rows = 2; // 切片行數
/ / 讀取來源影像
BufferedImage bi = ImageIO.read(new File(srcImageFile));
int srcHeight = bi.getWidth() ; // 源圖高度
if (srcWidth > 0 && srcHeight > 0) {
ImageFilter cropFilter;
Image image = bi.getScaledInstance(srcWidth, srcHeight, Image. SCALE_DEFAULT);
int destWidth = srcWidth; // 每張切片的寬度
// 計算切片的寬度與高度
if (srcWidth % cols == 0) {
destWidth = srcWidth / cols;# destWidth = (int) Math.floor(srcWidth / cols) + 1;
( srcHeight % rows == 0) {
destHeight = srcHeight / rows;
} else {
destHeight = (int) Math.floor(srcWidth / rows) + 1;
}
/ / 循環建立切片
// 改善的想法:是否可用多執行緒加速切割速度
for (int j = 0; j < ; cols; j++) {
// 四個參數分別為影像起點座標 CropImageFilter(int x,int y,int width,int height)
(j * destWidth, i * destHeight,
img = Toolkit.getDefaultToolkit().createImage(
new FilteredImageSource(image.getSource(),
BufferedImage tag = new BufferedImage(destWidth,
stHeight, BufferedImage.TYPE_INT_RGB);
中 g = tag.getGraphics();
g.drawImage(img, 0, 0, null); g.dispose();
// 輸出為檔案
PEG ", new File(descDir
} }
}
{
e.printStackTrace();
}
}
#
/**
* 影像切割(指定切片的寬度和高度)
* @param srcImageFile 來源影像位址
* @param descDir 切片目標資料夾>預設200
* @param destHeight 目標切片高度。預設150
*/
public final static void cut3(String srcImageFile, String descDir,
if(destWidth<=0 ) destWidth = 200; // 切片寬度
if(destHeight<=0) destHeight = 150; // # BufferedImage bi = ImageIO.read(new File(srcImageFile ));
int srcWidth = bi.getHeight(); // 來源圖寬度
if (srcWidth > destWidth && srcHeight > destHeight) {
為image = bi.getScaledInstance(srcWidth, srcHeight, Image.SCALE_DEFAULT);
int cols = 0; // 切片橫向數#; // 切片切片int rows = 0; // 切片縱向數量
// 計算切片的橫向與縱向數量
cols = srcWidth / destWidth;
if (srcHeight % destHeight == 0) {
else {
rows = (int) Math.floor(srcHeight/ destHeight) + // 循環建立切片
// 改善的想法:是否可用多執行緒加快切割速度
for (int i = 0; i < rows; i++) {
// 四個參數分別為影像起點座標及寬高
//即: CropImageFilter(int x,int y id cropFilter = new CropImageFilter(j * destWidth, i * destHeight,
destWidth, destHeight);
img = Toolkit.getDefaultToolkit().createImage(
new FilteredImageSource(image.getSource(),
BufferedImage tag = new BufferedImage(destWidth,
stHeight, BufferedImage.TYPE_INT_RGB);
中 g = tag.getGraphics();
g.drawImage(img, 0, 0, null); g.dispose();
// 輸出為檔案
PEG ", new File(descDir
} }
}
{
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 目標影像位址
* @param destImageFile 目標影像位址
*/
public final static void grey(String srcImageFile, String destImageFile) {
rcImageFile));
ColorSpace cs = ColorSpace.getInstance(ColorSpace.CS_GRAY);
op.filter(src, null);
ImageIO.write(src , "JPEG", new File(destImageFile));
} /**
* 新增文字浮水印
* @param pressText 水印文字
* @param srcImageFile 來源影像位址
## * @param fontStyle 浮水印的字型樣式
* @param fontSize 水印的字體大小
* @param alpha 透明度:alpha 必須是範圍[0.0, 1.0] 之內(包含邊界值)的一個浮點數
*/
public final static void pressText(String pressText,
String srcImageFile, String destImage ,int x,
int y, float alpha ) {
嘗試{
File img = new File(srcImageFile);
int width = src.getWidth(null);
int height = src.getHeight(null);
BufferedImage image = new BufferedImage(寬度, 高度,
Graphics2D g = image.createGraphics();
g.drawImage(src, 0, 0, 寬度, 高度, null);
g.setColor(color);
g.setComposite(AlphaComposite.getInstance( AlphaComposite.SRC_ATOP,
alpha)));
Text, (width - (getLength(pressText) * fontSize))
/ 2 + x , (height - fontSize) / 2 + y);
g.dispose();
ImageIO.write((BufferedImage) image, "JPEG", new File(destImageFile));// 輸出到文件流
} catch (例外e) {
e.printStackTrace();
}##
/**
* 新增文字浮水印
* @param pressText 水印文字
* @param srcImageFile 來源影像位址
* @param fontStyle 字體樣式
* @param color 字體顏色
* @param fontSize 字體大小
* @param x 修正值:alpha 必須是範圍[0.0, 1.0] 之內(包含邊界值)的一個浮點數字
*/
public final static void pressText2(String pressText, String srcImageFile,String destImageFile,
int y, float alpha) {
嘗試{
File img = new File(srcImage age); int width = src.getWidth(null);
int height = src.getHeight(null);
Buffered BufferedImage.TYPE_INT_RGB);
Graphics2D g = image.create .drawImage(src, 0, 0, 寬度, 高度, null);
g.setColor(color);
g.setComposite (AlphaComposite.getInstance(AlphaComposite.SRC_ATOP,
, g.drawString(pressText, (width - (getLength(pressText) * fontSize)))
/ 2 + x, (高- fontSize) / 2 + y);
ageIO.write((BufferedImage) image, "JPEG", new File(destImageFile));
} catch (例外 e) {
e.printStackTrace();
}##
/**
* 新增圖片水印
* @param pressImg 水印圖片
* @param srcImageFile 來源影像位址
預設在中間
* @param y 修正值。 預設在中間
* @param alpha 透明度:alpha 必須是範圍 [0.0, 1.0] 之內(包含邊界值)的浮點數
*/
public final static void pressImage(String pressImg, String srcImageFile,String destImageFile,
嘗試 {
文件img = new File(srcImageFile);
影像src = ImageIO.read(img);
int height = src.getHeight(null);## #bufferedimage image = new bufferedimage(wideth,height,
bufferedimage.type_int_rgb);
graphics2d g = image.creategraphics();
g.drawimage(src,0,0,0,0,0, 0,0,wideth,height,null,null),null,null) ;
// 水印檔案
int width_biao = src_biao. getWidth(null);
int height_biao = src_biao.getHeight(null) ;
alpha));
g.drawImage(src_biao, ( width - width_biao) / 2,
(高度- height_biao)/ 2 ,idth_biao, height_biao, null_biao)/ 2 , w # g.dispose();
ImageIO.write(( BufferedImage) image, "JPEG", new File(destImageFile));
} catch (異常e) {
## /* *
* 計算text的長度(一個中文算兩個字元)
* @param text
* @return
*/
public final static int getLength(String text ) {
int length = 0;
for (int i = 0;我 if (new String(text.charAt(i) + "").getBytes().length > 1) {
} else {
長度+ = 1;
# }
與長度/使用 2;#
以上是詳解java實現影像的縮放,切割,類型轉換,水印等功能的實現的詳細內容。更多資訊請關注PHP中文網其他相關文章!