欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java中如何獲取圖片文件格式(后綴)

 更新時間:2023年06月12日 14:58:27   作者:CringKong  
這篇文章主要介紹了Java中如何獲取圖片文件格式(后綴),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

Java獲取圖片文件格式(后綴)

今天做一個爬蟲,使用正則匹配到<img>標簽以后,直接用InputStream流進行下載到內(nèi)存,然后再使用FileOutputStream保存到硬盤,但是要獲取圖片文件格式再進行保存。

一開始使用了正則截取,比如<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里就帶有 . 那怎么辦(雖然我沒見到過)

假設一個圖片標簽 <img src="/book/en/v2/.hahaha/basic-branching-1.png" />,那這樣就不能保證是截取到后綴。

想到PHP和Python都有直接處理圖片的庫,很方便,Java應該也有這種操作吧。

經(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代碼獲取圖片格式及顏色模型

近期服務器總是在上傳下載圖片的時候出現(xiàn)CPU飆高的情況,想對上傳方法進行下改進,查到了一個方法使用ImageIO.read()讀取圖片,但是可能存在讀取CMYK編碼的JPEG圖片失真問題,本片文章先用Java代碼查看給定圖片的格式以及顏色模型。

顏色模型

CMYK(Cyan, Magenta, Yellow, Black - Key Plate)模型,指的是使用(青色,品紅、黃、黑)4種印刷使用的油墨顏色,作為保存圖片的格式。它主要用在印刷中, 讓i印刷色彩更加逼真。

RGB模式,是使用(紅、綠、藍)三基色, 作為保存圖片的格式。RGB值通常使用三個指定0到255之間的整數(shù),分別代表紅、綠、藍色的強度。它主要用于網(wǎng)頁設計中, 方便屏幕顯示。

二者在文件保存格式上是有區(qū)別的,我們可以通過JPG文件的保存格式上區(qū)分:

(1)CMYK模式:JPEG文件中前8個字節(jié)是FF D8 FF E1

(2)RGB模式:JPEG文件中前8個字節(jié)是FF D8 FF E0

Java代碼查看圖片類型,以及將圖片轉(zhuǎ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)十六進制
	 */
	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)成十六進制
			String str = byte2HexStr(result);
			// 將十六進制串保存到txt文件中
			PrintWriter pw = new PrintWriter(new FileWriter("F:/image.txt"));
			pw.println(str);
			pw.close();
			Long end = System.currentTimeMillis();
			System.out.println("圖片轉(zhuǎn)十六進制花費時間:" + (end - start));
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	/*
	 * 實現(xiàn)字節(jié)數(shù)組向十六進制的轉(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)文章

  • 基于spring-boot-maven-plugin插件打包lib文件外置的方法(layout模式為ZIP模式)

    基于spring-boot-maven-plugin插件打包lib文件外置的方法(layout模式為ZIP模式)

    Maven是一個插件執(zhí)行框架,所有工作都由插件完成,同時?Maven?基于構(gòu)建生命周期的核心概念,明確定義了構(gòu)建和分發(fā)特定工件(項目)的過程,接下來通過本文給大家介紹下基于spring-boot-maven-plugin插件打包lib文件外置(layout模式為ZIP模式),需要的朋友可以參考下
    2022-09-09
  • Java實現(xiàn)刪除排序鏈表中的重復元素的方法

    Java實現(xiàn)刪除排序鏈表中的重復元素的方法

    這篇文章主要介紹了Java實現(xiàn)刪除排序鏈表中的重復元素的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-02-02
  • java讀取ftp中TXT文件的案例

    java讀取ftp中TXT文件的案例

    這篇文章主要介紹了java讀取ftp中TXT文件的案例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09
  • 在eclipse中修改tomcat的部署路徑操作

    在eclipse中修改tomcat的部署路徑操作

    這篇文章主要介紹了在eclipse中修改tomcat的部署路徑操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01
  • 把spring boot項目發(fā)布tomcat容器(包含發(fā)布到tomcat6的方法)

    把spring boot項目發(fā)布tomcat容器(包含發(fā)布到tomcat6的方法)

    這篇文章主要介紹了把spring boot項目發(fā)布tomcat容器(包含發(fā)布到tomcat6的方法),然后在文章給大家提到了如何將Spring Boot項目打包部署到外部Tomcat,需要的朋友參考下吧
    2017-11-11
  • Springboot?定時任務分布式下冪等性解決方案

    Springboot?定時任務分布式下冪等性解決方案

    這篇文章主要介紹了Springboot定時任務分布式下冪等性如何解決,本文通過示例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-07-07
  • java簡單手寫版本實現(xiàn)時間輪算法

    java簡單手寫版本實現(xiàn)時間輪算法

    這篇文章主要為大家詳細介紹了java簡單手寫版本實現(xiàn)時間輪算法,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-04-04
  • Java接口默認方法帶來的問題分析【二義性問題】

    Java接口默認方法帶來的問題分析【二義性問題】

    這篇文章主要介紹了Java接口默認方法帶來的問題,結(jié)合實例形式分析了java接口帶來的二義性問題,需要的朋友可以參考下
    2019-08-08
  • Java中@Async異步失效的9種場景

    Java中@Async異步失效的9種場景

    最近在項目某個方法使用@Async注解,但是該方法還是同步執(zhí)行了,異步不起作用,到底是什么原因呢?接下來本文給大家介紹了Java?@Async異步失效的9種場景,需要的朋友可以參考下
    2024-05-05
  • 使用MyBatis的動態(tài)SQL注解實現(xiàn)實體的CRUD操作代碼

    使用MyBatis的動態(tài)SQL注解實現(xiàn)實體的CRUD操作代碼

    在使用MyBatis進行數(shù)據(jù)庫操作時,動態(tài)SQL注解提供了一種優(yōu)雅的方式來編寫動態(tài)SQL語句,MyBatis?3.x?版本提供了下四個CRUD的高級注解,這些注解可以幫助開發(fā)者在Mapper接口中動態(tài)地構(gòu)建SQL語句,本文給大家介紹了使用MyBatis的動態(tài)SQL注解實現(xiàn)實體的CRUD操作
    2024-06-06

最新評論