使用awt中的類操作圖片縮放、變圓透明、水印、合併
阿新 • • 發佈:2019-01-01
本文是因為以前寫過的一個公眾號,需要做這些操作,現在總結一下。當時對awt只限於瞭解,用到的時候看了看文件和別人的程式碼,做了幾次測試後寫的一個整合工具。
本文會依據先後順序介紹使用awt的工具類對圖片進行縮放、變圓透明、合併、水印,雖然每個都是分步的,但是使用者可以看下api根據實際情況把縮放、變圓透明這些功能放在一個方法中。
圖片縮放大小
使用者可以根據具體API和程式碼的例子自行實現(下述示例的程式碼並不規範,僅作為演示功能使用)
public void testResizeImage() throws IOException {
File imageFile = new File("E:\\test\\header.png");
//縮放後的寬度和高度
int width = 120, height = 120;
BufferedImage imageBuffer = ImageIO.read(imageFile);
BufferedImage tempBuffer = new BufferedImage(width, height, BufferedImage.TYPE_INT_BGR);
//使用tempBuffer建立一個temp畫板
Graphics graphics = tempBuffer.createGraphics();
//把原檔案畫在這個畫板上
graphics.drawImage(imageBuffer, 0, 0, width, height, null);
imageBuffer.flush();
tempBuffer.flush();
String filePath = "E:\\test\\header-120x120.png";
File temp = new File(filePath);
temp.createNewFile();
//把畫出來120*120圖片的buffer寫到temp檔案
ImageIO.write(tempBuffer, "png" , temp);
}
效果圖如下所示:
圖片變圓透明
使用者可以根據具體API和程式碼的例子自行實現(下述示例的程式碼並不規範,僅作為演示功能使用)
/**
* 圖片變圓,四個角變透明
* @throws IOException
*/
public void testResizeCircle() throws IOException {
File imageFile = new File("E:\\test\\header-120x120.png");
BufferedImage imageBuffer = ImageIO.read(imageFile);
int width = imageBuffer.getWidth(), height = imageBuffer.getHeight();
BufferedImage tempBuffer = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
Ellipse2D.Double shape = new Ellipse2D.Double(0, 0, width, height);
Graphics2D g2 = tempBuffer.createGraphics();
tempBuffer = g2.getDeviceConfiguration().createCompatibleImage(width, height, Transparency.TRANSLUCENT);
g2 = tempBuffer.createGraphics();
g2.setComposite(AlphaComposite.Clear);
g2.fill(new Rectangle(width, height));
g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC, 1.0f));
g2.setClip(shape);
g2.drawImage(imageBuffer, 0, 0, null);
g2.dispose();
ImageIO.write(tempBuffer, "png", imageFile);
}
效果圖如下所示:
圖片合併
使用者可以根據具體API和程式碼的例子自行實現(下述示例的程式碼並不規範,僅作為演示功能使用)
//合併兩個圖片(也可以合併多個)
public void testMerge() throws IOException {
File newFile = new File("E:\\test\\merge.jpg");
File backgroundFile = new File("E:\\test\\background.jpg");
File headerFile = new File("E:\\test\\header-120x120.png");
BufferedImage backgroundImage = ImageIO.read(backgroundFile); //背景圖片
BufferedImage headerImage = ImageIO.read(headerFile); //頭像圖片
int bWidth = backgroundImage.getWidth(), bHeight = backgroundImage.getHeight();
int hWidth = headerImage.getWidth(), hHeight = headerImage.getHeight();
BufferedImage combined = new BufferedImage(bWidth, bHeight, BufferedImage.TYPE_INT_RGB);
Graphics g = combined.getGraphics();
//先把背景圖畫到畫板上
g.drawImage(backgroundImage, 0, 0, null);
//計算出頭像放置的 Y 軸位置
Double tempHeight1 = backgroundImage.getHeight() * 0.2;
Long tempHeight2 = Math.round(tempHeight1);
Integer headerImageY = Integer.valueOf(tempHeight2.toString());
g.drawImage(headerImage, (bWidth - hWidth) / 2, headerImageY, null);
newFile.createNewFile();
ImageIO.write(combined, "jpg", newFile);
}
效果圖如下所示:
圖片水印
使用者可以根據具體API和程式碼的例子自行實現(下述示例的程式碼並不規範,僅作為演示功能使用)
//圖片加水印
public void testWaterMark() throws IOException {
File uploadFile = new File("E:\\test\\background.jpg");
Font font = new Font(Font.MONOSPACED, Font.BOLD, 20);// 新增字型的屬性設定
BufferedImage uploadImage = ImageIO.read(uploadFile);
int width = uploadImage.getWidth();
int height = uploadImage.getHeight();
BufferedImage combined = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
Graphics g = combined.getGraphics();
g.drawImage(uploadImage, 0, 0, null);
g.setFont(font);
g.setColor(Color.RED);
g.drawString("PBlog | www.pelinli.com", 10, 20);
g.drawString("https://github.com/penglongli", 10, 40);
ImageIO.write(combined, "png", uploadFile);
}
效果圖如下所示: