日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java图像处理,拷贝图像EXIF信息

發(fā)布時間:2024/1/23 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java图像处理,拷贝图像EXIF信息 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

? ? ? ? 在使用java做數(shù)字圖像處理的時候,有時候需要保留圖像的EXIF屬性信息,比如相機型號,GPS位置等。處理圖像的時候,一般直接通過ImageIO讀取圖像每個像素上的RGB色彩信息,但是圖像的其他屬性信息是沒有讀取的,這樣在處理完圖像RGB色彩信息,通過ImageIO重新寫入圖片或?qū)懭胄聢D片都不會保留原圖的屬性信息。

? ? ? 查閱了大量資料,有通過第三方圖像處理庫來讀取的,也有直接通過解析圖像文件編碼來讀取EXIF區(qū)域信息。最后查閱java官方文檔,發(fā)現(xiàn)其實ImageIO下還包含很多圖像處理相關(guān)的類庫,其中IIOImage是一個圖像容器,可以存入和取出圖像柵格信息(RenderedImage)和屬性信息(IIOMetadata)。操作流程如下:

? ? ? ? 1、通過ImageIO的getImageReadersByFormatName()方法和createImageInputStream()來獲取imagereader迭代器和實例化圖像輸入流;

// 通過ImageIO和圖像輸入流設(shè)置imageReader Iterator<ImageReader> iterator = ImageIO.getImageReadersByFormatName("JPG"); // 通過ImageIO獲取imageReader迭代器 ImageReader imageReader = iterator.next(); // 通過迭代器實例化ImageReader ImageInputStream imageInputStream = ImageIO.createImageInputStream(srcImage); // 通過ImageIO實例化圖像輸入流 imageReader.setInput(imageInputStream, true);

? ? ? ? 2、通過imagereader讀取源圖片所有信息,存入IIOImage,再從IIOImage中g(shù)et到屬性信息,存入IIOMetadata;

// 讀取源圖片EXIF信息,存入IIOMetadata ImageReadParam imageReadParam = imageReader.getDefaultReadParam(); IIOImage iioImage = imageReader.readAll(0, imageReadParam); IIOMetadata iioMetadata = iioImage.getMetadata();

? ? ? ? 3、用和讀取源圖像同樣的方式讀取目標(biāo)圖片信息;

// 讀取目標(biāo)圖片信息 Iterator<ImageReader> iterator2 = ImageIO.getImageReadersByFormatName("JPG"); ImageReader imageReader2 = iterator2.next(); ImageInputStream imageInputStream2 = ImageIO.createImageInputStream(destImage); imageReader2.setInput(imageInputStream2, true);

? ? ? ? 4、將源圖片iioMetadata信息存入目標(biāo)圖片的IIOImage;

// 將源圖片iioMetadata信息存入目標(biāo)圖片的IIOImage ImageReadParam imageReadParam2 = imageReader2.getDefaultReadParam(); IIOImage iioImage2 = imageReader2.readAll(0, imageReadParam2); iioImage2.setMetadata(iioMetadata);

? ? ? ? 5、通過圖像輸出流和imagewriter將iioImage寫入目標(biāo)圖片;

// 將iioImage寫入目標(biāo)圖片 ImageOutputStream imageOutputStream = ImageIO.createImageOutputStream(destImage);Iterator<ImageWriter> iterator3 = ImageIO.getImageWritersByFormatName("JPG"); ImageWriter imageWriter = iterator3.next(); imageWriter.setOutput(imageOutputStream); imageWriter.write(iioImage2);

? ? ? ? 6、最后不要忘了關(guān)閉流;

//關(guān)閉流 imageInputStream.close(); imageOutputStream.close();

? ? ? ? 完整的測試代碼如下:

import java.io.File; import java.util.Iterator;import javax.imageio.IIOImage; import javax.imageio.ImageIO; import javax.imageio.ImageReadParam; import javax.imageio.ImageReader; import javax.imageio.ImageWriter; import javax.imageio.metadata.IIOMetadata; import javax.imageio.stream.ImageInputStream; import javax.imageio.stream.ImageOutputStream;public class test {public static void main(String[] args) throws Exception{File srcImage = new File("C:/Users/admin/Desktop/test/1.jpg");File destImage = new File("C:/Users/admin/Desktop/test/2.jpg");// 通過ImageIO和圖像輸入流設(shè)置imageReaderIterator<ImageReader> iterator = ImageIO.getImageReadersByFormatName("JPG"); // 通過ImageIO獲取imageReader迭代器ImageReader imageReader = iterator.next(); // 通過迭代器實例化ImageReaderImageInputStream imageInputStream = ImageIO.createImageInputStream(srcImage); // 通過ImageIO實例化圖像輸入流imageReader.setInput(imageInputStream, true);// 讀取源圖片IIOMetadata信息,存入IIOMetadataImageReadParam imageReadParam = imageReader.getDefaultReadParam();IIOImage iioImage = imageReader.readAll(0, imageReadParam);IIOMetadata iioMetadata = iioImage.getMetadata();// 讀取目標(biāo)圖片信息Iterator<ImageReader> iterator2 = ImageIO.getImageReadersByFormatName("JPG");ImageReader imageReader2 = iterator2.next();ImageInputStream imageInputStream2 = ImageIO.createImageInputStream(destImage);imageReader2.setInput(imageInputStream2, true);// 將源圖片iioMetadata信息存入目標(biāo)圖片的IIOImageImageReadParam imageReadParam2 = imageReader2.getDefaultReadParam();IIOImage iioImage2 = imageReader2.readAll(0, imageReadParam2);iioImage2.setMetadata(iioMetadata); // 將iioImage寫入目標(biāo)圖片ImageOutputStream imageOutputStream = ImageIO.createImageOutputStream(destImage);Iterator<ImageWriter> iterator3 = ImageIO.getImageWritersByFormatName("JPG");ImageWriter imageWriter = iterator3.next();imageWriter.setOutput(imageOutputStream);imageWriter.write(iioImage2);//關(guān)閉流imageInputStream.close();imageOutputStream.close();} }

? ? ? ?

? ? ? ? 可以看到,兩張不同照片,此時有了一樣的屬性信息。另外,實際情況下,處理圖像數(shù)據(jù),為了減少IO次數(shù),可以從IIOImage中取出圖像柵格數(shù)據(jù),轉(zhuǎn)為BufferedImage對象,對image進(jìn)行處理后再存入IIOImage;

BufferedImage image = (BufferedImage) iioImage.getRenderedImage(); iioImage.setRenderedImage(image);

?

總結(jié)

以上是生活随笔為你收集整理的java图像处理,拷贝图像EXIF信息的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。