javax.imageio

使用 ImageIO 类的静态方法可以执行许多常见的图像 I/O 操作。   

此包包含一些基本类和接口,有的用来描述图像文件内容(包括元数据和缩略图)(IIOImage);

有的用来控制图像读取过程(ImageReader、ImageReadParam)和控制图像写入过程(ImageWriter 和 ImageWriteParam);

详细 Java ImageIO处理图像的封装例子     http://www.gzhost.net/Artdetail-1609-649.html

 




[java] view plain copy

 


  1. package com.mapbar.graphics;  
  2.   
  3. import java.awt.Graphics;  
  4. import java.awt.Image;  
  5. import java.awt.Rectangle;  
  6. import java.awt.image.BufferedImage;  
  7. import java.io.File;  
  8. import java.io.FileOutputStream;  
  9. import java.io.IOException;  
  10. import java.util.Arrays;  
  11. import java.util.Iterator;  
  12.   
  13. import javax.imageio.ImageIO;  
  14. import javax.imageio.ImageReadParam;  
  15. import javax.imageio.ImageReader;  
  16. import javax.imageio.metadata.IIOMetadata;  
  17. import javax.imageio.stream.ImageInputStream;  
  18.   
  19. import com.sun.image.codec.jpeg.JPEGCodec;  
  20. import com.sun.image.codec.jpeg.JPEGImageEncoder;  
  21.   
  22. /** 
  23.  *  
  24.  * Class ImageIOTest.java 
  25.  *  
  26.  * Description javax.imageio 操作 
  27.  *  
  28.  * Company mapbar 
  29.  *  
  30.  * author Chenll E-mail: Chenll@mapbar.com 
  31.  *  
  32.  * Version 1.0 
  33.  *  
  34.  * Date 2012-7-23 上午11:16:17 
  35.  */  
  36. public class ImageIOTest {  
  37.   
  38.     /** 
  39.      * Java Image I/O API 支持的读入,写出普通的格式,如果需要开发其它格式,还需要第三方插件,eg JIMI, JMagic 
  40.      */  
  41.     public void formatImageNames() {  
  42.   
  43.         String[] imageFormats = ImageIO.getReaderFormatNames();  
  44.         // [jpg, BMP, bmp, JPG, wbmp, jpeg, png, PNG, JPEG, WBMP, GIF, gif]  
  45.         System.out.println(Arrays.asList(imageFormats));  
  46.   
  47.         String[] imageFormats1 = ImageIO.getWriterFormatNames();  
  48.         // [BMP, bmp, jpg, JPG, wbmp, jpeg, png, PNG, JPEG, WBMP, GIF, gif]  
  49.         System.out.println(Arrays.asList(imageFormats1));  
  50.   
  51.     }  
  52.   
  53.     /** 
  54.      * Image I/O高级操作 ImageReader ImageWriter 通过ImageReader 
  55.      * 可以获取图片信息而不用把整张图片数据都读入内存。 
  56.      *  
  57.      * @throws IOException 
  58.      */  
  59.     public void imageReaderOp() throws IOException {  
  60.         Iterator<ImageReader> readers = ImageIO  
  61.                 .getImageReadersByFormatName("JPG");  
  62.         ImageReader reader = readers.next();  
  63.         // 构造输入源  
  64.         File bigFile = new File("E:\\big.JPG");  
  65.         ImageInputStream iis = ImageIO.createImageInputStream(bigFile);  
  66.         // 输入源和ImageReader关联  
  67.         reader.setInput(iis, true);  
  68.         // 获取第一张图片的高度,试图解码文件的必要部分,去获取图片的宽度,而不用读取任何一个象素  
  69.         int imageIndex = 0;  
  70.         int width = reader.getWidth(imageIndex);  
  71.     }  
  72.   
  73.     /** 
  74.      * 控制图片操作,ImageReadParam 可以让程序更好的控制内存,比如指定一个感兴趣的区域 
  75.      *  
  76.      * @throws IOException 
  77.      */  
  78.     public void imageReadParamOp() throws IOException {  
  79.         int imageIndex = 0;  
  80.         Iterator<ImageReader> readers = ImageIO  
  81.                 .getImageReadersByFormatName("JPG");  
  82.         ImageReader reader = readers.next();  
  83.         File bigFile = new File("E:\\big.JPG");  
  84.         ImageInputStream iis = ImageIO.createImageInputStream(bigFile);  
  85.         reader.setInput(iis, true);  
  86.         ImageReadParam irp = reader.getDefaultReadParam();  
  87.         int halfWidth = reader.getWidth(imageIndex) / 2;  
  88.         int halfHeight = reader.getHeight(imageIndex) / 2;  
  89.         Rectangle rect = new Rectangle(0, 0, halfWidth, halfHeight);  
  90.         irp.setSourceRegion(rect);  
  91.         BufferedImage bi = reader.read(imageIndex, irp);  
  92.         ImageIO.write(bi, "JPG", new File("E:\\big_half.JPG"));  
  93.     }  
  94.   
  95.     /** 
  96.      * 图片元信息 
  97.      *  
  98.      * @throws IOException 
  99.      */  
  100.     public void ImageMetadata() throws IOException {  
  101.         int imageIndex = 0;  
  102.         Iterator<ImageReader> readers = ImageIO  
  103.                 .getImageReadersByFormatName("JPG");  
  104.         ImageReader reader = readers.next();  
  105.         File bigFile = new File("E:\\big.JPG");  
  106.         ImageInputStream iis = ImageIO.createImageInputStream(bigFile);  
  107.         reader.setInput(iis, true);  
  108.         IIOMetadata metadata = reader.getImageMetadata(imageIndex);  
  109.     }  
  110.   
  111.     /** 
  112.      * 生成缩略图 
  113.      *  
  114.      * @throws IOException 
  115.      */  
  116.     public void generateSmall() throws IOException {  
  117.         File bigFile = new File("E:\\big.JPG");  
  118.         Image image = ImageIO.read(bigFile);  
  119.         int width = image.getWidth(null); // 3264  
  120.         int height = image.getHeight(null); // 2448  
  121.         BufferedImage buffi = new BufferedImage(width / 2, height / 2,  
  122.                 BufferedImage.TYPE_INT_RGB);  
  123.         Graphics g = buffi.getGraphics();  
  124.         g.drawImage(image, 0, 0, width / 2, height / 2, null);  
  125.         g.dispose();  
  126.         ImageIO.write(buffi, "JPG", new File("E:\\small.JPG"));// width:1632 height:1224  
  127.     }  
  128.   
  129.     public static void main(String[] args) throws IOException {  
  130.         ImageIOTest iot = new ImageIOTest();  
  131.         iot.generateSmall();  
  132.         iot.formatImageNames();  
  133.         iot.imageReaderOp();  
  134.         iot.imageReadParamOp();  
  135.         iot.ImageMetadata();  
  136.     }  
  137.   
  138. }