Java使用Thumbnailator實(shí)現(xiàn)圖片處理功能
使用Thumbnailator進(jìn)行圖片處理
Thumbnailator是一個(gè)簡單且功能強(qiáng)大的Java庫,用于生成縮略圖和執(zhí)行其他圖片處理任務(wù)。在這篇博客中,我們將介紹如何使用Thumbnailator進(jìn)行圖片的縮放、裁剪、旋轉(zhuǎn)等操作,并通過一些代碼示例來展示其強(qiáng)大功能。
1. 引入依賴
首先,在你的項(xiàng)目中添加Thumbnailator的依賴。以Maven項(xiàng)目為例,可以在pom.xml中添加以下依賴:
<dependency>
<groupId>net.coobird</groupId>
<artifactId>thumbnailator</artifactId>
<version>0.4.20</version>
</dependency>
2. 基本使用
2.1 縮放圖片
縮放圖片是Thumbnailator的基本功能之一。以下代碼演示了如何將圖片縮放到指定的大?。?/p>
import net.coobird.thumbnailator.Thumbnails;
import java.io.File;
import java.io.IOException;
public class ImageResizer {
public static void main(String[] args) {
try {
Thumbnails.of("input.jpg")
.size(200, 300)
.toFile("output.jpg");
} catch (IOException e) {
e.printStackTrace();
}
}
}
在上述代碼中,Thumbnails.of("input.jpg")加載了源圖片,size(200, 300)指定了目標(biāo)圖片的寬度和高度,toFile("output.jpg")則將處理后的圖片保存到文件。
2.2 保持寬高比
有時(shí)我們希望縮放圖片但保持其寬高比。這可以通過scale方法實(shí)現(xiàn):
import net.coobird.thumbnailator.Thumbnails;
import java.io.File;
import java.io.IOException;
public class ImageResizer {
public static void main(String[] args) {
try {
Thumbnails.of("input.jpg")
.scale(0.5)
.toFile("output.jpg");
} catch (IOException e) {
e.printStackTrace();
}
}
}
上述代碼將圖片縮放到原始大小的50%。
2.3 裁剪圖片
Thumbnailator也支持裁剪圖片。以下代碼演示了如何裁剪圖片的中央?yún)^(qū)域:
import net.coobird.thumbnailator.Thumbnails;
import net.coobird.thumbnailator.geometry.Positions;
import java.io.File;
import java.io.IOException;
public class ImageCropper {
public static void main(String[] args) {
try {
Thumbnails.of("input.jpg")
.sourceRegion(Positions.CENTER, 200, 200)
.size(200, 200)
.toFile("output.jpg");
} catch (IOException e) {
e.printStackTrace();
}
}
}
sourceRegion(Positions.CENTER, 200, 200)方法指定從圖片中央裁剪一個(gè)200x200的區(qū)域。
2.4 旋轉(zhuǎn)圖片
我們還可以使用Thumbnailator旋轉(zhuǎn)圖片。以下代碼演示了如何將圖片順時(shí)針旋轉(zhuǎn)90度:
import net.coobird.thumbnailator.Thumbnails;
import java.io.File;
import java.io.IOException;
public class ImageRotator {
public static void main(String[] args) {
try {
Thumbnails.of("input.jpg")
.rotate(90)
.toFile("output.jpg");
} catch (IOException e) {
e.printStackTrace();
}
}
}
rotate(90)方法將圖片順時(shí)針旋轉(zhuǎn)90度。
3. 高級(jí)使用
3.1 批量處理
Thumbnailator還支持批量處理圖片。以下代碼演示了如何將一個(gè)目錄中的所有圖片縮放到指定大?。?/p>
import net.coobird.thumbnailator.Thumbnails;
import java.io.File;
import java.io.IOException;
public class BatchImageResizer {
public static void main(String[] args) {
try {
Thumbnails.of(new File("inputDir").listFiles())
.size(200, 300)
.toFiles(Rename.PREFIX_DOT_THUMBNAIL);
} catch (IOException e) {
e.printStackTrace();
}
}
}
上述代碼將inputDir目錄中的所有圖片縮放到200x300,并在文件名前添加.thumbnail前綴。
3.2 轉(zhuǎn)換圖片格式
Thumbnailator也可以用于轉(zhuǎn)換圖片格式。以下代碼演示了如何將JPEG圖片轉(zhuǎn)換為PNG格式:
import net.coobird.thumbnailator.Thumbnails;
import java.io.File;
import java.io.IOException;
public class ImageFormatConverter {
public static void main(String[] args) {
try {
Thumbnails.of("input.jpg")
.size(200, 300)
.outputFormat("png")
.toFile("output.png");
} catch (IOException e) {
e.printStackTrace();
}
}
}
outputFormat("png")方法指定輸出圖片的格式為PNG。
3.3 添加水印
使用Thumbnailator可以輕松地在圖片上添加水印。以下代碼演示了如何在圖片右下角添加一個(gè)水?。?/p>
import net.coobird.thumbnailator.Thumbnails;
import net.coobird.thumbnailator.geometry.Positions;
import net.coobird.thumbnailator.filters.Watermark;
import java.awt.*;
import java.io.File;
import java.io.IOException;
public class ImageWatermarker {
public static void main(String[] args) {
try {
Thumbnails.of("input.jpg")
.size(800, 600)
.watermark(Positions.BOTTOM_RIGHT,
ImageIO.read(new File("watermark.png")),
0.5f)
.toFile("output.jpg");
} catch (IOException e) {
e.printStackTrace();
}
}
}
watermark(Positions.BOTTOM_RIGHT, watermarkImage, 0.5f)方法指定了水印的位置、圖片和透明度。
3.4 調(diào)整圖片質(zhì)量
可以通過Thumbnailator調(diào)整輸出圖片的質(zhì)量,特別是在生成JPEG格式圖片時(shí):
import net.coobird.thumbnailator.Thumbnails;
import java.io.File;
import java.io.IOException;
public class ImageQualityAdjuster {
public static void main(String[] args) {
try {
Thumbnails.of("input.jpg")
.size(800, 600)
.outputQuality(0.8)
.toFile("output.jpg");
} catch (IOException e) {
e.printStackTrace();
}
}
}
outputQuality(0.8)方法將輸出圖片的質(zhì)量設(shè)置為80%。
3.5 處理透明度
Thumbnailator也可以處理帶有透明度的圖片,如PNG格式圖片:
import net.coobird.thumbnailator.Thumbnails;
import java.io.File;
import java.io.IOException;
public class TransparentImageProcessor {
public static void main(String[] args) {
try {
Thumbnails.of("input.png")
.size(800, 600)
.outputFormat("png")
.toFile("output.png");
} catch (IOException e) {
e.printStackTrace();
}
}
}
3.6 鏈?zhǔn)讲僮?/h4>
Thumbnailator允許鏈?zhǔn)讲僮?,可以在一次操作中完成多種圖片處理任務(wù):
import net.coobird.thumbnailator.Thumbnails;
import net.coobird.thumbnailator.geometry.Positions;
import java.io.File;
import java.io.IOException;
public class ChainOperations {
public static void main(String[] args) {
try {
Thumbnails.of("input.jpg")
.size(800, 600)
.rotate(45)
.watermark(Positions.BOTTOM_RIGHT,
ImageIO.read(new File("watermark.png")),
0.5f)
.outputQuality(0.8)
.toFile("output.jpg");
} catch (IOException e) {
e.printStackTrace();
}
}
}
上述代碼展示了如何在一次操作中完成圖片的縮放、旋轉(zhuǎn)、添加水印和調(diào)整質(zhì)量。
3.7 保存到輸出流
Thumbnailator不僅可以將處理后的圖片保存到文件,還可以保存到輸出流中,比如字節(jié)數(shù)組輸出流:
import net.coobird.thumbnailator.Thumbnails;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
public class OutputStreamExample {
public static void main(String[] args) {
try {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
Thumbnails.of("input.jpg")
.size(800, 600)
.toOutputStream(baos);
byte[] imageBytes = baos.toByteArray();
// 現(xiàn)在可以使用imageBytes進(jìn)行其他處理
} catch (IOException e) {
e.printStackTrace();
}
}
}
3.8 讀取自輸入流
同樣地,Thumbnailator也可以從輸入流中讀取圖片:
import net.coobird.thumbnailator.Thumbnails;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.IOException;
public class InputStreamExample {
public static void main(String[] args) {
try (FileInputStream fis = new FileInputStream("input.jpg");
ByteArrayOutputStream baos = new ByteArrayOutputStream()) {
Thumbnails.of(fis)
.size(800, 600)
.toOutputStream(baos);
byte[] imageBytes = baos.toByteArray();
// 現(xiàn)在可以使用imageBytes進(jìn)行其他處理
} catch (IOException e) {
e.printStackTrace();
}
}
}
3.9 壓縮圖片
通過調(diào)整圖片的輸出質(zhì)量,可以實(shí)現(xiàn)壓縮圖片的目的。以下代碼演示了如何將JPEG圖片壓縮到指定的質(zhì)量水平:
import net.coobird.thumbnailator.Thumbnails;
import java.io.File;
import java.io.IOException;
public class ImageCompressor {
public static void main(String[] args) {
try {
Thumbnails.of("input.jpg")
.size(800, 600)
.outputQuality(0.5)
.toFile("compressed_output.jpg");
} catch (IOException e) {
e.printStackTrace();
}
}
}
在上面的代碼中,outputQuality(0.5)將輸出圖片的質(zhì)量設(shè)置為50%。這個(gè)參數(shù)的取值范圍是0到1,值越低,壓縮率越高,文件越小,但質(zhì)量也會(huì)越低。
3.10 限制文件大小進(jìn)行壓縮
通過調(diào)整圖片的尺寸和質(zhì)量,可以嘗試將圖片壓縮到接近某個(gè)目標(biāo)文件大小。下面是一個(gè)示例,通過迭代調(diào)整圖片質(zhì)量來接近目標(biāo)文件大?。?/p>
import net.coobird.thumbnailator.Thumbnails;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
public class FileSizeCompressor {
public static void main(String[] args) {
try {
String inputFilePath = "input.jpg";
String outputFilePath = "compressed_output.jpg";
long targetFileSize = 100 * 1024; // 目標(biāo)文件大小為100KB
compressImage(inputFilePath, outputFilePath, targetFileSize);
} catch (IOException e) {
e.printStackTrace();
}
}
private static void compressImage(String inputFilePath, String outputFilePath, long targetFileSize) throws IOException {
float quality = 1.0f;
byte[] imageBytes;
do {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
Thumbnails.of(inputFilePath)
.size(800, 600)
.outputQuality(quality)
.toOutputStream(baos);
imageBytes = baos.toByteArray();
quality -= 0.1f;
} while (imageBytes.length > targetFileSize && quality > 0);
FileOutputStream fos = new FileOutputStream(outputFilePath);
fos.write(imageBytes);
fos.close();
}
}
3.11 壓縮并保持透明度
對(duì)于PNG等支持透明度的圖片,可以在壓縮時(shí)保持透明度:
import net.coobird.thumbnailator.Thumbnails;
import java.io.File;
import java.io.IOException;
public class TransparentImageCompressor {
public static void main(String[] args) {
try {
Thumbnails.of("input.png")
.size(800, 600)
.outputFormat("png")
.outputQuality(0.8)
.toFile("compressed_output.png");
} catch (IOException e) {
e.printStackTrace();
}
}
}
3.12 結(jié)合尺寸調(diào)整和質(zhì)量壓縮
通過同時(shí)調(diào)整圖片尺寸和質(zhì)量,可以更有效地壓縮圖片文件大?。?/p>
import net.coobird.thumbnailator.Thumbnails;
import java.io.File;
import java.io.IOException;
public class SizeAndQualityCompressor {
public static void main(String[] args) {
try {
Thumbnails.of("input.jpg")
.size(800, 600)
.outputQuality(0.5)
.toFile("compressed_output.jpg");
} catch (IOException e) {
e.printStackTrace();
}
}
}
在這個(gè)例子中,圖片的尺寸被調(diào)整到800x600,同時(shí)輸出質(zhì)量被設(shè)置為50%。這種方法可以顯著減少圖片文件的大小。
結(jié)語
Thumbnailator是一個(gè)功能強(qiáng)大且易于使用的Java圖片處理庫。無論是縮放、裁剪、旋轉(zhuǎn)還是格式轉(zhuǎn)換,Thumbnailator都提供了簡潔的API,使這些操作變得非常簡單。希望通過這篇博客,你能夠更好地了解和使用Thumbnailator進(jìn)行圖片處理。
以上就是Java使用Thumbnailator實(shí)現(xiàn)圖片處理功能的詳細(xì)內(nèi)容,更多關(guān)于Java Thumbnailator圖片處理的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
springboot2.3之后hibernate-validator依賴缺失【踩坑】
這篇文章主要介紹了springboot2.3之后hibernate-validator依賴缺失【踩坑】,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11
Postman form-data、x-www-form-urlencoded的區(qū)別及說明
這篇文章主要介紹了Postman form-data、x-www-form-urlencoded的區(qū)別及說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2025-03-03
Java使用JDBC向MySQL數(shù)據(jù)庫批次插入10W條數(shù)據(jù)(測(cè)試效率)
使用JDBC連接MySQL數(shù)據(jù)庫進(jìn)行數(shù)據(jù)插入的時(shí)候,特別是大批量數(shù)據(jù)連續(xù)插入(100000),如何提高效率呢?今天小編通過本教程給大家介紹下2016-12-12
java對(duì)象中什么時(shí)候適合用static修飾符踩坑解決記錄
這篇文章主要為大家介紹了java對(duì)象中什么時(shí)候適合用static修飾符踩坑解決記錄,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-09-09
java awt實(shí)現(xiàn)計(jì)算器功能
這篇文章主要為大家詳細(xì)介紹了java awt實(shí)現(xiàn)計(jì)算器功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-12-12
Mybatis分頁查詢的實(shí)現(xiàn)(Rowbounds和PageHelper)
本文主要介紹了Mybatis分頁查詢的實(shí)現(xiàn)(Rowbounds和PageHelper),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01

