Java中如何獲取圖片文件格式(后綴)
Java獲取圖片文件格式(后綴)
今天做一個爬蟲,使用正則匹配到<img>標(biāo)簽以后,直接用InputStream流進(jìn)行下載到內(nèi)存,然后再使用FileOutputStream保存到硬盤,但是要獲取圖片文件格式再進(jìn)行保存。
一開始使用了正則截取,比如<img src="/book/en/v2/images/basic-branching-1.png" />,就直接用字符串截取.png的內(nèi)容
String imgSrc = "/book/en/v2/images/basic-branching-1.png";
String formatName = imgSrc.split("\\.")[1];但是后來突然想到如果URL的path里就帶有 . 那怎么辦(雖然我沒見到過)
假設(shè)一個圖片標(biāo)簽 <img src="/book/en/v2/.hahaha/basic-branching-1.png" />,那這樣就不能保證是截取到后綴。
想到PHP和Python都有直接處理圖片的庫,很方便,Java應(yīng)該也有這種操作吧。
經(jīng)過去StackOverflow查找一番,發(fā)現(xiàn)確實Java這種操作很麻煩,所以自己實現(xiàn)了一個工具方法。
? ? public static List<String> getImageFormat(InputStream srcInputStream) throws IOException {
? ? ? ? List<String> formatNameList = new ArrayList<>();
? ? ? ? // 獲取ImageInputStream 對象
? ? ? ? ImageInputStream imageInputStream = ImageIO.createImageInputStream(srcInputStream);
? ? ? ? // 獲取ImageReader對象的迭代器
? ? ? ? Iterator<ImageReader> iterator = ImageIO.getImageReaders(imageInputStream);
? ? ? ? // 如果能獲得ImageReader對象則說明流中含有圖片文件
? ? ? ? while(iterator.hasNext()) {
? ? ? ? ? ? // ImageReader對象的getFormatName()方法可以獲得圖片格式
? ? ? ? ? ? formatNameList.add(iterator.next().getFormatName());
? ? ? ? }
? ? ? ? return formatNameList;
? ? }這樣我們就能從連續(xù)的圖片文件流中獲取多個圖片文件,實現(xiàn)獲取文件真實格式到的后綴。
Java代碼獲取圖片格式及顏色模型
近期服務(wù)器總是在上傳下載圖片的時候出現(xiàn)CPU飆高的情況,想對上傳方法進(jìn)行下改進(jìn),查到了一個方法使用ImageIO.read()讀取圖片,但是可能存在讀取CMYK編碼的JPEG圖片失真問題,本片文章先用Java代碼查看給定圖片的格式以及顏色模型。
顏色模型
CMYK(Cyan, Magenta, Yellow, Black - Key Plate)模型,指的是使用(青色,品紅、黃、黑)4種印刷使用的油墨顏色,作為保存圖片的格式。它主要用在印刷中, 讓i印刷色彩更加逼真。
RGB模式,是使用(紅、綠、藍(lán))三基色, 作為保存圖片的格式。RGB值通常使用三個指定0到255之間的整數(shù),分別代表紅、綠、藍(lán)色的強(qiáng)度。它主要用于網(wǎng)頁設(shè)計中, 方便屏幕顯示。
二者在文件保存格式上是有區(qū)別的,我們可以通過JPG文件的保存格式上區(qū)分:
(1)CMYK模式:JPEG文件中前8個字節(jié)是FF D8 FF E1
(2)RGB模式:JPEG文件中前8個字節(jié)是FF D8 FF E0
Java代碼查看圖片類型,以及將圖片轉(zhuǎn)十六進(jìn)制
package com.flex;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Iterator;
import javax.imageio.ImageIO;
import javax.imageio.ImageReader;
import javax.imageio.stream.ImageInputStream;
import org.junit.Test;
public class TestImage {
@Test
public void testImageFormat() {
File img = new File("F:/1518048669186_0ssai3.jpg");
System.out.println(getImageFormat(img));//JPEG
}
@Test
public void testColorFormat() {
getImageHex("F:/1518048669186_0ssai3.jpg");
System.out.println("image.text長度:" + new File("F:/image.txt").length());
}
/*
* 獲得圖片的格式,例如:JPEG、GIF等
*/
public String getImageFormat(Object obj) {
try {
ImageInputStream iis = ImageIO.createImageInputStream(obj);
Iterator<ImageReader> iterator = ImageIO.getImageReaders(iis);
while (iterator.hasNext()) {
ImageReader reader = (ImageReader) iterator.next();
return reader.getFormatName();
}
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
/*
* 圖片轉(zhuǎn)十六進(jìn)制
*/
public void getImageHex(String path) {
try {
Long start = System.currentTimeMillis();
FileInputStream fis = new FileInputStream(path);
java.io.ByteArrayOutputStream bos = new java.io.ByteArrayOutputStream();
byte[] buff = new byte[1024];
int len = 0;
while ((len = fis.read(buff)) != -1) {
bos.write(buff, 0, len);
}
// 得到圖片的字節(jié)數(shù)組
byte[] result = bos.toByteArray();
// 字節(jié)數(shù)組轉(zhuǎn)成十六進(jìn)制
String str = byte2HexStr(result);
// 將十六進(jìn)制串保存到txt文件中
PrintWriter pw = new PrintWriter(new FileWriter("F:/image.txt"));
pw.println(str);
pw.close();
Long end = System.currentTimeMillis();
System.out.println("圖片轉(zhuǎn)十六進(jìn)制花費(fèi)時間:" + (end - start));
} catch (IOException e) {
e.printStackTrace();
}
}
/*
* 實現(xiàn)字節(jié)數(shù)組向十六進(jìn)制的轉(zhuǎn)換方法
*/
public static String byte2HexStr(byte[] b) {
String hs = "";
String stmp = "";
for (int n = 0; n < b.length; n++) {
stmp = (Integer.toHexString(b[n] & 0XFF));
if (stmp.length() == 1)
hs = hs + "0" + stmp;
else
hs = hs + stmp;
}
return hs.toUpperCase();
}
}結(jié)果如圖


總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
部署springboot項目到云服務(wù)器的兩種方式(jar+war)
本文主要介紹了部署springboot項目到云服務(wù)器的兩種方式,主要介紹了jar和war兩種方式,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-12-12
SpringBoot@DeleteMapping(/xxx/{id})請求報405的解決
這篇文章主要介紹了SpringBoot@DeleteMapping(/xxx/{id})請求報405的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-01-01
淺析Java迭代器Iterator和Iterable的區(qū)別
Java語言中,Iterator和Iterable都是用來遍歷集合類數(shù)據(jù)結(jié)構(gòu)的接口,雖然它們有很多相似的地方,但在具體實現(xiàn)中卻有著一些不同之處,本文將詳細(xì)分析它們的區(qū)別,并提供相應(yīng)的代碼示例,需要的朋友可以參考下2023-07-07
Java使用Apache POI和EasyExcel讀取Excel文件的實現(xiàn)方案
Java 讀取 Excel 文件核心依賴 Apache POI(兼容 .xls(Excel 97-2003)和 .xlsx(Excel 2007+))或 EasyExcel(阿里開源,低內(nèi)存、高性能),以下是兩種主流方案的完整實現(xiàn),需要的朋友可以參考下2025-12-12

