Java使用Thumbnailator實(shí)現(xiàn)圖片處理功能
使用Thumbnailator進(jìn)行圖片處理
Thumbnailator是一個(gè)簡(jiǎn)單且功能強(qiáng)大的Java庫(kù),用于生成縮略圖和執(zhí)行其他圖片處理任務(wù)。在這篇博客中,我們將介紹如何使用Thumbnailator進(jìn)行圖片的縮放、裁剪、旋轉(zhuǎn)等操作,并通過(guò)一些代碼示例來(lái)展示其強(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的基本功能之一。以下代碼演示了如何將圖片縮放到指定的大小:
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í)我們希望縮放圖片但保持其寬高比。這可以通過(guò)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ì)量
可以通過(guò)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 壓縮圖片
通過(guò)調(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)行壓縮
通過(guò)調(diào)整圖片的尺寸和質(zhì)量,可以嘗試將圖片壓縮到接近某個(gè)目標(biāo)文件大小。下面是一個(gè)示例,通過(guò)迭代調(diào)整圖片質(zhì)量來(lái)接近目標(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ì)量壓縮
通過(guò)同時(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é)語(yǔ)
Thumbnailator是一個(gè)功能強(qiáng)大且易于使用的Java圖片處理庫(kù)。無(wú)論是縮放、裁剪、旋轉(zhuǎn)還是格式轉(zhuǎn)換,Thumbnailator都提供了簡(jiǎn)潔的API,使這些操作變得非常簡(jiǎn)單。希望通過(guò)這篇博客,你能夠更好地了解和使用Thumbnailator進(jìn)行圖片處理。
以上就是Java使用Thumbnailator實(shí)現(xiàn)圖片處理功能的詳細(xì)內(nèi)容,更多關(guān)于Java Thumbnailator圖片處理的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
java實(shí)現(xiàn)學(xué)生信息錄入界面
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)學(xué)生信息錄入界面,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-04-04java實(shí)現(xiàn)投票程序設(shè)計(jì)
這篇文章主要介紹了java實(shí)現(xiàn)投票程序設(shè)計(jì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2015-12-12java實(shí)現(xiàn)在線預(yù)覽--poi實(shí)現(xiàn)word、excel、ppt轉(zhuǎn)html的方法
這篇文章主要介紹了java實(shí)現(xiàn)在線預(yù)覽--poi實(shí)現(xiàn)word、excel、ppt轉(zhuǎn)html的方法,本文需要引入poi的jar包給大家介紹的非常詳細(xì),需要的朋友可以參考下2019-09-09mybatis單筆批量保存實(shí)體數(shù)據(jù)的方法
這篇文章主要介紹了mybatis單筆批量保存實(shí)體數(shù)據(jù)的相關(guān)知識(shí),非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2018-01-01關(guān)于SpringBoot 打包成的可執(zhí)行jar不能被其他項(xiàng)目依賴的問(wèn)題
這篇文章主要介紹了關(guān)于SpringBoot 打包成的可執(zhí)行jar不能被其他項(xiàng)目依賴的問(wèn)題,本文給大家通過(guò)圖文實(shí)例相結(jié)合給大家分享解決方法,需要的朋友可以參考下2020-10-10Java深入學(xué)習(xí)圖形用戶界面GUI之創(chuàng)建窗體
圖形編程中,窗口是一個(gè)重要的概念,窗口其實(shí)是一個(gè)矩形框,應(yīng)用程序可以使用其從而達(dá)到輸出結(jié)果和接受用戶輸入的效果,學(xué)習(xí)了GUI就讓我們用它來(lái)創(chuàng)建一個(gè)窗體2022-05-05詳解SpringBoot如何實(shí)現(xiàn)緩存預(yù)熱
緩存預(yù)熱是指在 Spring Boot 項(xiàng)目啟動(dòng)時(shí),預(yù)先將數(shù)據(jù)加載到緩存系統(tǒng)(如 Redis)中的一種機(jī)制,下面我們就來(lái)看看SpringBoot是如何實(shí)現(xiàn)緩存預(yù)熱的吧2024-01-01