1. 程式人生 > 其它 >Java中圖片處理工具類——能滿足各種需求

Java中圖片處理工具類——能滿足各種需求

在多年Java開發過程中我總結了一些處理圖片的方法,把程式碼分享出來與大家一起學習,程式碼如下:


import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.awt.image.RenderedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URL;
import java.net.URLConnection;
import java.util.UUID;
import javax.imageio.ImageIO;
/**
*
* @專案名 ssh
* @功能 圖片處理工具
* @類名 ImageTools
* @作者 wurui
* @日期 Aug 30, 20113:26:42 PM
* @版本 1.0
*/
public class ImageTools {
private static final int WIDTH = 220;
/**
* 根據圖片路徑讀取圖片到緩
*
* @param fileName
* 圖片路徑
* @return
*/
public static BufferedImage readImage(String fileName) {
BufferedImage bi = null;
try {
bi = ImageIO.read(new File(fileName));
} catch (IOException ioe) {
ioe.printStackTrace();
}
return bi;
}
/**
* 根據檔案物件讀取到緩
*
* @param file
* 檔案物件
* @return
*/
public static BufferedImage readImage(File file) {
BufferedImage bi = null;
try {
bi = ImageIO.read(file);
} catch (IOException ioe) {
ioe.printStackTrace();
}
return bi;
}
/**
* 將快取圖片輸出到檔案�?
*
* @param im
* 快取圖片
* @param formatName
* 檔案格式(字尾:jpg)
* @param fileName
* 檔案路徑
* @return
*/
public static boolean writeImage(RenderedImage im, String formatName, String fileName) {
boolean result = false;
try {
result = ImageIO.write(im, formatName, new File(fileName));
} catch (IOException ioe) {
ioe.printStackTrace();
}
return result;
}
/**
* 將快取圖片輸出到檔案�?
*
* @param im
* 快取圖片
* @param formatName
* 檔案格式(字尾:jpg)
* @param targetFile
* 目標檔案�?
* @return
*/
public static boolean writeImage(RenderedImage im, String formatName, File targetFile) {
boolean result = false;
try {
result = ImageIO.write(im, formatName, targetFile);
} catch (IOException ioe) {
ioe.printStackTrace();
}
return result;
}
/**
* 將快取圖片輸出到輸出�?
* @param im
* @param formatName
* @param stream
* @return
*/
public static boolean writeImage(RenderedImage im, String formatName, OutputStream stream) {
boolean result = false;
try {
result = ImageIO.write(im, formatName, stream);
} catch (IOException ioe) {
ioe.printStackTrace();
}
return result;
}
/**
* 輸出為JPEG格式圖片
*
* @param im
* @param fileName
* @return
*/
public static boolean writeJPEGImage(RenderedImage im, String fileName) {
return writeImage(im, "JPEG", fileName);
}
/**
* 輸出為JPEG格式
*
* @param im
* @param targetFile
* @return
*/
public static boolean writeJPEGImage(RenderedImage im, File targetFile) {
return writeImage(im, "JPEG", targetFile);
}
public static boolean writeGIFImage(RenderedImage im, String fileName) {
return writeImage(im, "GIF", fileName);
}
public static boolean writeGIFImage(RenderedImage im, File targetFile) {
return writeImage(im, "GIF", targetFile);
}
public static boolean writePNGImage(RenderedImage im, String fileName) {
return writeImage(im, "PNG", fileName);
}
public static boolean writePNGImage(RenderedImage im, File targetFile) {
return writeImage(im, "PNG", targetFile);
}
public static boolean writeBMPImage(RenderedImage im, String fileName) {
return writeImage(im, "BMP", fileName);
}
public static boolean writeBMPImage(RenderedImage im, File targetFile) {
return writeImage(im, "BMP", targetFile);
}
/**
* 複製圖片到目標文�?
*
* @param file
* 源文�?
* @param targetFile
* 目標檔案
* @return 真為成功
*/
public static boolean copyImage(File file, File targetFile) {
String postfix = getPostfix(file);
if ("JPEG".equalsIgnoreCase(postfix) || "GPG".equalsIgnoreCase(postfix)) {
return writeJPEGImage(writeThumb(file), targetFile);
}
if ("GIF".equalsIgnoreCase(postfix)) {
return writeGIFImage(writeThumb(file), targetFile);
}
if ("PNG".equalsIgnoreCase(postfix)) {
return writePNGImage(writeThumb(file), targetFile);
}
if ("BMP".equalsIgnoreCase(postfix)) {
return writeBMPImage(writeThumb(file), targetFile);
}
return writeJPEGImage(writeThumb(file), targetFile);
}
/**
* 複製圖片檔案
*
* @param file
* 源文�?
* @param targetFile
* 目標檔案
* @param width
* 寬度
* @return
*/
public static boolean copyImage(File file, File targetFile, int width) {
String postfix = getPostfix(file);
if ("JPEG".equalsIgnoreCase(postfix) || "GPG".equalsIgnoreCase(postfix)) {
return writeJPEGImage(writeThumb(file, width), targetFile);
}
if ("GIF".equalsIgnoreCase(postfix)) {
return writeGIFImage(writeThumb(file, width), targetFile);
}
if ("PNG".equalsIgnoreCase(postfix)) {
return writePNGImage(writeThumb(file, width), targetFile);
}
if ("BMP".equalsIgnoreCase(postfix)) {
return writeBMPImage(writeThumb(file, width), targetFile);
}
return writeJPEGImage(writeThumb(file, width), targetFile);
}
/**
* 得到檔案字尾名稱
*
* @param file
* 檔案
* @return
*/
public static String getPostfix(File file) {
String postfix = file.getAbsolutePath();
postfix = postfix.substring(postfix.lastIndexOf(".") + 1).toUpperCase();
return postfix;
}
/**
* 寬度超過預設值後,得到縮放圖�?
*
* @param file
* 檔案
* @return
*/
public static BufferedImage writeThumb(File file) {
BufferedImage bi = null;
try {
bi = ImageIO.read(file);
int x = 0, y = 0;
if (bi.getWidth() > WIDTH) {
x = WIDTH;
y = Math.round(bi.getHeight() / (bi.getWidth() / (x * 1.0f)));
} else {
x = bi.getWidth();
y = bi.getHeight();
}
return getZoomImage(bi, x, y);
} catch (IOException e) {
e.printStackTrace();
}
return bi;
}
/**
* 寬度超過預設值後,得到縮放圖�?
*
* @param file
* 檔案
* @param width
* 寬度
* @return 快取圖片
*/
public static BufferedImage writeThumb(File file, int width) {
int x = 0, y = 0;
if (width > WIDTH) {
x = WIDTH;
y = Math.round(width / (width / (x * 1.0f)));
} else {
x = width;
y = width;
}
return getZoomImage(file, x, y);
}
/**
* 根據檔案路徑和寬度高度得到縮放圖�?
*
* @param path
* 路徑
* @param width
* 寬度
* @param height
* 高度
* @return 快取圖片
*/
public static BufferedImage getZoomImage(String path, int width, int height) {
return getZoomImage(new File(path), width, height);
}
/**
* 得到縮放圖片
*
* @param file
* 檔案
* @param width
* @param height
* @return
*/
public static BufferedImage getZoomImage(File file, int width, int height) {
BufferedImage bi;
BufferedImage oimage = null;
try {
bi = ImageIO.read(file);
return getZoomImage(bi, width, height);
} catch (IOException e) {
e.printStackTrace();
}
return oimage;
}
/**
* 得到縮放圖片
*
* @param img
* 圖片
* @param width
* 寬度
* @param height
* 高度
* @return
*/
public static BufferedImage getZoomImage(Image img, int width, int height) {
BufferedImage oimage = null;
Image temp = img.getScaledInstance(width, height, Image.SCALE_DEFAULT);
oimage = new BufferedImage(width, height, BufferedImage.TYPE_INT_BGR);
oimage.getGraphics().drawImage(temp, 0, 0, null);
oimage.getGraphics().dispose();
return oimage;
}
//實現人員簽名圖片合併
public static String doImageMerging(String docIDs){
//C:softgzex5X5.2.7_devX5.2.7apache-tomcatwebapps.... untimeBusinessServer
String path="";
String[] tempPaths=path.split("webapps");
// 在記憶體中建立一個檔案物件,注意:此時還沒有在硬碟對應目錄下建立實實在在的檔案
String pathFile=tempPaths[0]+"personImages";
//測試
String fileNameTemap="bbbb";
crateFiles(pathFile,fileNameTemap);
//根據docId下載圖片
String[] images=docIDs.split(",");
String image1=pathFile + "//"+createImageName()+".jpg";//圖片1地址
try {
download(images[0], new File(image1));
} catch (Exception e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
String image2=pathFile + "//"+createImageName()+".jpg";;//圖片2地址
try {
download(images[1], new File(image2));
} catch (Exception e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
// 讀取待合併的檔案
BufferedImage bi1 = null;
BufferedImage bi2 = null;
// 呼叫mergeImage方法獲得合併後的影象
BufferedImage destImg = null;
// System.out.println("圖片合併的情況:");
try {
bi2 = getBufferedImage(image1);
bi1 = getBufferedImage(image2);
} catch (IOException e) {
e.printStackTrace();
}
// 呼叫mergeImage方法獲得合併後的影象
try {
destImg = mergeImage(bi1, bi2, false);//true為水平,false為垂直
} catch (IOException e) {
e.printStackTrace();
}
// 儲存影象
String savePath=pathFile+"//";//檔案存放路徑
String fileName=createImageName()+".jpg";//檔名稱
String fileType="jpg";//檔案格式
saveImage(destImg, savePath,fileName, fileType);
System.out.println("圖片合併完畢!");
return savePath+fileName;
}
//建立資料夾
private static void crateFiles(String path,String fileName){
File f = new File(path,fileName);
if(f.exists()) {
// 檔案已經存在,輸出檔案的相關資訊
System.out.println(f.getAbsolutePath());
System.out.println(f.getName());
System.out.println(f.length());
} else {
// 先建立檔案所在的目錄
f.getParentFile().mkdirs();
try {
// 建立新檔案
f.createNewFile();
} catch (IOException e) {
System.out.println("建立新檔案時出現了錯誤。。。");
e.printStackTrace();
}
}
}
//下載圖片
public static void download(String urlString, File filename) throws Exception {
System.out.println("download xml start.......");
URL url = new URL(urlString);
URLConnection con = url.openConnection();
InputStream is = con.getInputStream();
byte[] bs = new byte[1024];
int len;
OutputStream os = new FileOutputStream(filename);
while ((len = is.read(bs)) != -1) {
os.write(bs, 0, len);
}
os.close();
is.close();
System.out.println("download xml over.......");
}
/**
* @param fileUrl
* 檔案絕對路徑或相對路徑
* @return 讀取到的快取影象
* @throws IOException
* 路徑錯誤或者不存在該檔案時丟擲IO異常
*/
public static BufferedImage getBufferedImage(String fileUrl)
throws IOException {
File f = new File(fileUrl);
return ImageIO.read(f);
}
/**
* @param savedImg
* 待儲存的影象
* @param saveDir
* 儲存的目錄
* @param fileName
* 儲存的檔名,必須帶字尾,比如 "beauty.jpg"
* @param format
* 檔案格式:jpg、png或者bmp
* @return
*/
public static boolean saveImage(BufferedImage savedImg, String saveDir,
String fileName, String format) {
boolean flag = false;
// 先檢查儲存的圖片格式是否正確
String[] legalFormats = { "jpg", "JPG", "png", "PNG", "bmp", "BMP" };
int i = 0;
for (i = 0; i < legalFormats.length; i++) {
if (format.equals(legalFormats[i])) {
break;
}
}
if (i == legalFormats.length) { // 圖片格式不支援
System.out.println("不是儲存所支援的圖片格式!");
return false;
}
// 再檢查檔案字尾和儲存的格式是否一致
String postfix = fileName.substring(fileName.lastIndexOf('.') + 1);
if (!postfix.equalsIgnoreCase(format)) {
System.out.println("待儲存檔案字尾和儲存的格式不一致!");
return false;
}
String fileUrl = saveDir + fileName;
File file = new File(fileUrl);
try {
flag = ImageIO.write(savedImg, format, file);
} catch (IOException e) {
e.printStackTrace();
}
return flag;
}
/**
* 待合併的兩張圖必須滿足這樣的前提,如果水平方向合併,則高度必須相等;如果是垂直方向合併,寬度必須相等。
* mergeImage方法不做判斷,自己判斷。
*
* @param img1
* 待合併的第一張圖
* @param img2
* 帶合併的第二張圖
* @param isHorizontal
* 為true時表示水平方向合併,為false時表示垂直方向合併
* @return 返回合併後的BufferedImage物件
* @throws IOException
*/
public static BufferedImage mergeImage(BufferedImage img1,
BufferedImage img2, boolean isHorizontal) throws IOException {
int w1 = img1.getWidth();
int h1 = img1.getHeight();
int w2 = img2.getWidth();
int h2 = img2.getHeight();
// 從圖片中讀取RGB
int[] ImageArrayOne = new int[w1 * h1];
ImageArrayOne = img1.getRGB(0, 0, w1, h1, ImageArrayOne, 0, w1); // 逐行掃描影象中各個畫素的RGB到陣列中
int[] ImageArrayTwo = new int[w2 * h2];
ImageArrayTwo = img2.getRGB(0, 0, w2, h2, ImageArrayTwo, 0, w2);
// 生成新圖片
BufferedImage DestImage = null;
if (isHorizontal) { // 水平方向合併
DestImage = new BufferedImage(w1+w2, h1, BufferedImage.TYPE_INT_RGB);
DestImage.setRGB(0, 0, w1, h1, ImageArrayOne, 0, w1); // 設定上半部分或左半部分的RGB
DestImage.setRGB(w1, 0, w2, h2, ImageArrayTwo, 0, w2);
} else { // 垂直方向合併
Graphics2D g2d=null;
if(w1>w2){
DestImage = new BufferedImage(w1, h1 + h2,
BufferedImage.TYPE_INT_RGB);//TYPE_INT_RGB
g2d = DestImage.createGraphics();
g2d.setPaint(Color.WHITE);
g2d.fillRect(0, 0, w1, h1 + h2);
g2d.dispose();
} else{
DestImage = new BufferedImage(w2, h1 + h2,
BufferedImage.TYPE_INT_RGB);//TYPE_INT_RGB
g2d = DestImage.createGraphics();
g2d.setPaint(Color.WHITE);
g2d.fillRect(0, 0, w2, h1 + h2);
g2d.dispose();
}
DestImage.setRGB(0, 0, w1, h1, ImageArrayOne, 0, w1); // 設定上半部分或左半部分的RGB
DestImage.setRGB(0, h1, w2, h2, ImageArrayTwo, 0, w2); // 設定下半部分的RGB
}
return DestImage;
}
//隨機生成圖片名稱
public static String createImageName(){
// 建立 GUID 物件
UUID uuid = UUID.randomUUID();
// 得到物件產生的ID
String a = uuid.toString();
// 轉換為大寫
a = a.toUpperCase();
// 替換 -
a = a.replaceAll("-", "");
return a;
}
}