Java OCR 图像智能字符识别技术

几天一直在研究 OCR 技术,据我了解的情况,国内最专业的 OCR 软件只有 2 家,清华 TH-OCR 和汉王 OCR ,看了很多的OCR 技术发现好多对英文与数字的支持都很好,可惜很多都不支持中文字符。 Asprise-OCR , Tesseract 3.0 以前的版本,都不支持中文,其实我用了下 Asprise-OCR 算是速度比较的快了,可惜他鄙视中文,这个没有办法,正好这段时间 知名的开源 OCR 引擎 Tesseract 3.0 版本发布了,他给我们带来的好消息就是支持中文,相关的下载项目网站是:http://code.google.com/p/tesseract-ocr

虽然速度不是很客观可是毕竟人家开始支持中文也算是不错的,一个英文的语言包大概是 1.8M , 中文简体的语言包是39.5M , 中文繁体的语言包是 53M ,这样就知道为什么识别中文慢的原因了

 

Java代码   收藏代码
  1. package com.ocr;  
  2.   
  3. import java.awt.Graphics2D;  
  4. import java.awt.color.ColorSpace;  
  5. import java.awt.geom.AffineTransform;  
  6. import java.awt.image.AffineTransformOp;  
  7. import java.awt.image.BufferedImage;  
  8. import java.awt.image.ColorConvertOp;  
  9. import java.awt.image.ColorModel;  
  10. import java.awt.image.MemoryImageSource;  
  11. import java.awt.image.PixelGrabber;  
  12.   
  13. /** 
  14.  * 
  15.  * 图像过滤,增强OCR识别成功率 
  16.  * 
  17.  */  
  18. public class ImageFilter {  
  19.   
  20.     private BufferedImage image;  
  21.     private int iw, ih;  
  22.     private int[] pixels;  
  23.   
  24.     public ImageFilter(BufferedImage image) {  
  25.        this.image = image;  
  26.        iw = image.getWidth();  
  27.        ih = image.getHeight();  
  28.        pixels = new int[iw * ih];  
  29.     }  
  30.   
  31.     /** 图像二值化 */  
  32.     public BufferedImage changeGrey() {  
  33.        PixelGrabber pg = new PixelGrabber(image.getSource(), 0, 0, iw, ih, pixels, 0, iw);  
  34.        try {  
  35.            pg.grabPixels();  
  36.        } catch (InterruptedException e) {  
  37.            e.printStackTrace();  
  38.        }  
  39.   
  40.        // 设定二值化的域值,默认值为100  
  41.        int grey = 100;  
  42.        // 对图像进行二值化处理,Alpha值保持不变  
  43.        ColorModel cm = ColorModel.getRGBdefault();  
  44.   
  45.        for (int i = 0; i < iw * ih; i++) {  
  46.            int red, green, blue;  
  47.            int alpha = cm.getAlpha(pixels[i]);  
  48.            if (cm.getRed(pixels[i]) > grey) {  
  49.               red = 255;  
  50.            } else {  
  51.               red = 0;  
  52.            }  
  53.   
  54.            if (cm.getGreen(pixels[i]) > grey) {  
  55.               green = 255;  
  56.            } else {  
  57.               green = 0;  
  58.            }  
  59.   
  60.            if (cm.getBlue(pixels[i]) > grey) {  
  61.               blue = 255;  
  62.            } else {  
  63.               blue = 0;  
  64.            }  
  65.   
  66.            pixels[i] = alpha << 24 | red << 16 | green << 8 | blue;  
  67.        }  
  68.   
  69.        // 将数组中的象素产生一个图像  
  70.        return ImageIOHelper.imageProducerToBufferedImage(new MemoryImageSource(iw, ih, pixels, 0, iw));  
  71.     }  
  72.   
  73.    
  74.   
  75.     /** 提升清晰度,进行锐化 */  
  76.     public BufferedImage sharp() {  
  77.        PixelGrabber pg = new PixelGrabber(image.getSource(), 0, 0, iw, ih, pixels, 0, iw);  
  78.        try {  
  79.            pg.grabPixels();  
  80.        } catch (InterruptedException e) {  
  81.            e.printStackTrace();  
  82.        }  
  83.   
  84.        // 象素的中间变量  
  85.        int tempPixels[] = new int[iw * ih];  
  86.        for (int i = 0; i < iw * ih; i++) {  
  87.            tempPixels[i] = pixels[i];  
  88.        }  
  89.   
  90.        // 对图像进行尖锐化处理,Alpha值保持不变  
  91.        ColorModel cm = ColorModel.getRGBdefault();  
  92.        for (int i = 1; i < ih - 1; i++) {  
  93.   
  94.            for (int j = 1; j < iw - 1; j++) {  
  95.               int alpha = cm.getAlpha(pixels[i * iw + j]);  
  96.               // 对图像进行尖锐化  
  97.               int red6 = cm.getRed(pixels[i * iw + j + 1]);  
  98.               int red5 = cm.getRed(pixels[i * iw + j]);  
  99.               int red8 = cm.getRed(pixels[(i + 1) * iw + j]);  
  100.               int sharpRed = Math.abs(red6 - red5) + Math.abs(red8 - red5);  
  101.               int green5 = cm.getGreen(pixels[i * iw + j]);  
  102.               int green6 = cm.getGreen(pixels[i * iw + j + 1]);  
  103.               int green8 = cm.getGreen(pixels[(i + 1) * iw + j]);  
  104.               int sharpGreen = Math.abs(green6 - green5) + Math.abs(green8 - green5);  
  105.               int blue5 = cm.getBlue(pixels[i * iw + j]);  
  106.               int blue6 = cm.getBlue(pixels[i * iw + j + 1]);  
  107.               int blue8 = cm.getBlue(pixels[(i + 1) * iw + j]);  
  108.               int sharpBlue = Math.abs(blue6 - blue5) + Math.abs(blue8 - blue5);  
  109.   
  110.               if (sharpRed > 255) {  
  111.                   sharpRed = 255;  
  112.               }  
  113.   
  114.               if (sharpGreen > 255) {  
  115.                   sharpGreen = 255;  
  116.               }  
  117.   
  118.               if (sharpBlue > 255) {  
  119.                   sharpBlue = 255;  
  120.               }  
  121.   
  122.               tempPixels[i * iw + j] = alpha << 24 | sharpRed << 16 | sharpGreen << 8 | sharpBlue;  
  123.            }  
  124.        }  
  125.   
  126.        // 将数组中的象素产生一个图像  
  127.        return ImageIOHelper.imageProducerToBufferedImage(new MemoryImageSource(iw, ih, tempPixels, 0, iw));  
  128.     }  
  129.   
  130.    
  131.   
  132.     /** 中值滤波 */  
  133.     public BufferedImage median() {  
  134.        PixelGrabber pg = new PixelGrabber(image.getSource(), 0, 0, iw, ih, pixels, 0, iw);  
  135.        try {  
  136.            pg.grabPixels();  
  137.        } catch (InterruptedException e) {  
  138.            e.printStackTrace();  
  139.        }  
  140.   
  141.        // 对图像进行中值滤波,Alpha值保持不变  
  142.        ColorModel cm = ColorModel.getRGBdefault();  
  143.        for (int i = 1; i < ih - 1; i++) {  
  144.            for (int j = 1; j < iw - 1; j++) {  
  145.               int red, green, blue;  
  146.               int alpha = cm.getAlpha(pixels[i * iw + j]);  
  147.               // int red2 = cm.getRed(pixels[(i - 1) * iw + j]);  
  148.               int red4 = cm.getRed(pixels[i * iw + j - 1]);  
  149.               int red5 = cm.getRed(pixels[i * iw + j]);  
  150.               int red6 = cm.getRed(pixels[i * iw + j + 1]);  
  151.               // int red8 = cm.getRed(pixels[(i + 1) * iw + j]);  
  152.   
  153.               // 水平方向进行中值滤波  
  154.               if (red4 >= red5) {  
  155.                   if (red5 >= red6) {  
  156.                      red = red5;  
  157.                   } else {  
  158.                      if (red4 >= red6) {  
  159.                          red = red6;  
  160.                      } else {  
  161.                          red = red4;  
  162.                      }  
  163.                   }  
  164.               } else {  
  165.                   if (red4 > red6) {  
  166.                      red = red4;  
  167.                   } else {  
  168.                       if (red5 > red6) {  
  169.                          red = red6;  
  170.                      } else {  
  171.                          red = red5;  
  172.                      }  
  173.                   }  
  174.               }  
  175.   
  176.               // int green2 = cm.getGreen(pixels[(i - 1) * iw + j]);  
  177.               int green4 = cm.getGreen(pixels[i * iw + j - 1]);  
  178.               int green5 = cm.getGreen(pixels[i * iw + j]);  
  179.               int green6 = cm.getGreen(pixels[i * iw + j + 1]);  
  180.               // int green8 = cm.getGreen(pixels[(i + 1) * iw + j]);  
  181.   
  182.               // 水平方向进行中值滤波  
  183.               if (green4 >= green5) {  
  184.                   if (green5 >= green6) {  
  185.                      green = green5;  
  186.                   } else {  
  187.                      if (green4 >= green6) {  
  188.                          green = green6;  
  189.                      } else {  
  190.                          green = green4;  
  191.                      }  
  192.                   }  
  193.               } else {  
  194.                   if (green4 > green6) {  
  195.                       green = green4;  
  196.                   } else {  
  197.                      if (green5 > green6) {  
  198.                          green = green6;  
  199.                      } else {  
  200.                          green = green5;  
  201.                      }  
  202.                   }  
  203.               }  
  204.   
  205.               // int blue2 = cm.getBlue(pixels[(i - 1) * iw + j]);  
  206.               int blue4 = cm.getBlue(pixels[i * iw + j - 1]);  
  207.               int blue5 = cm.getBlue(pixels[i * iw + j]);  
  208.               int blue6 = cm.getBlue(pixels[i * iw + j + 1]);  
  209.               // int blue8 = cm.getBlue(pixels[(i + 1) * iw + j]);  
  210.   
  211.               // 水平方向进行中值滤波  
  212.               if (blue4 >= blue5) {  
  213.                   if (blue5 >= blue6) {  
  214.                      blue = blue5;  
  215.                   } else {  
  216.                      if (blue4 >= blue6) {  
  217.                          blue = blue6;  
  218.                      } else {  
  219.                          blue = blue4;  
  220.                      }  
  221.                   }  
  222.               } else {  
  223.                   if (blue4 > blue6) {  
  224.                      blue = blue4;  
  225.                   } else {  
  226.                      if (blue5 > blue6) {  
  227.                          blue = blue6;  
  228.                      } else {  
  229.                          blue = blue5;  
  230.                      }  
  231.                   }  
  232.               }  
  233.               pixels[i * iw + j] = alpha << 24 | red << 16 | green << 8 | blue;  
  234.            }  
  235.        }  
  236.   
  237.        // 将数组中的象素产生一个图像  
  238.        return ImageIOHelper.imageProducerToBufferedImage(new MemoryImageSource(iw, ih, pixels, 0, iw));  
  239.     }  
  240.   
  241.     /** 线性灰度变换 */  
  242.     public BufferedImage lineGrey() {  
  243.        PixelGrabber pg = new PixelGrabber(image.getSource(), 0, 0, iw, ih, pixels, 0, iw);  
  244.        try {  
  245.            pg.grabPixels();  
  246.        } catch (InterruptedException e) {  
  247.            e.printStackTrace();  
  248.        }  
  249.   
  250.        // 对图像进行进行线性拉伸,Alpha值保持不变  
  251.        ColorModel cm = ColorModel.getRGBdefault();  
  252.   
  253.        for (int i = 0; i < iw * ih; i++) {  
  254.            int alpha = cm.getAlpha(pixels[i]);  
  255.            int red = cm.getRed(pixels[i]);  
  256.            int green = cm.getGreen(pixels[i]);  
  257.            int blue = cm.getBlue(pixels[i]);  
  258.   
  259.            // 增加了图像的亮度  
  260.            red = (int) (1.1 * red + 30);  
  261.            green = (int) (1.1 * green + 30);  
  262.            blue = (int) (1.1 * blue + 30);  
  263.            if (red >= 255) {  
  264.               red = 255;  
  265.            }  
  266.   
  267.            if (green >= 255) {  
  268.               green = 255;  
  269.            }  
  270.   
  271.            if (blue >= 255) {  
  272.               blue = 255;  
  273.            }  
  274.            pixels[i] = alpha << 24 | red << 16 | green << 8 | blue;  
  275.        }  
  276.   
  277.        // 将数组中的象素产生一个图像  
  278.        return ImageIOHelper.imageProducerToBufferedImage(new MemoryImageSource(iw, ih, pixels, 0, iw));  
  279.     }  
  280.   
  281.     /** 转换为黑白灰度图 */  
  282.     public BufferedImage grayFilter() {  
  283.        ColorSpace cs = ColorSpace.getInstance(ColorSpace.CS_GRAY);  
  284.        ColorConvertOp op = new ColorConvertOp(cs, null);  
  285.        return op.filter(image, null);  
  286.     }  
  287.   
  288.     /** 平滑缩放 */  
  289.     public BufferedImage scaling(double s) {  
  290.        AffineTransform tx = new AffineTransform();  
  291.        tx.scale(s, s);  
  292.        AffineTransformOp op = new AffineTransformOp(tx, AffineTransformOp.TYPE_BILINEAR);  
  293.        return op.filter(image, null);  
  294.     }  
  295.   
  296.     public BufferedImage scale(Float s) {  
  297.        int srcW = image.getWidth();  
  298.        int srcH = image.getHeight();  
  299.        int newW = Math.round(srcW * s);  
  300.        int newH = Math.round(srcH * s);  
  301.   
  302.        // 先做水平方向上的伸缩变换  
  303.        BufferedImage tmp=new BufferedImage(newW, newH, image.getType());  
  304.        Graphics2D g= tmp.createGraphics();  
  305.        for (int x = 0; x < newW; x++) {  
  306.            g.setClip(x, 0, 1, srcH);  
  307.            // 按比例放缩  
  308.            g.drawImage(image, x - x * srcW / newW, 0, null);  
  309.        }  
  310.   
  311.         // 再做垂直方向上的伸缩变换  
  312.        BufferedImage dst = new BufferedImage(newW, newH, image.getType());  
  313.        g = dst.createGraphics();  
  314.        for (int y = 0; y < newH; y++) {  
  315.            g.setClip(0, y, newW, 1);  
  316.            // 按比例放缩  
  317.            g.drawImage(tmp, 0, y - y * srcH / newH, null);  
  318.        }  
  319.        return dst;  
  320.     }  
  321.   
  322. }  
  323.   
  324.    

 

Java代码   收藏代码
  1. package com.ocr;  
  2.    
  3. import java.awt.Graphics2D;  
  4. import java.awt.Image;  
  5. import java.awt.Toolkit;  
  6. import java.awt.image.BufferedImage;  
  7. import java.awt.image.DataBufferByte;  
  8. import java.awt.image.ImageProducer;  
  9. import java.awt.image.WritableRaster;  
  10. import java.io.File;  
  11. import java.io.IOException;  
  12. import java.util.Iterator;  
  13. import java.util.Locale;  
  14. import javax.imageio.IIOImage;  
  15. import javax.imageio.ImageIO;  
  16. import javax.imageio.ImageReader;  
  17. import javax.imageio.ImageWriteParam;  
  18. import javax.imageio.ImageWriter;  
  19. import javax.imageio.metadata.IIOMetadata;  
  20. import javax.imageio.stream.ImageInputStream;  
  21. import javax.imageio.stream.ImageOutputStream;  
  22. import javax.swing.JOptionPane;  
  23. import com.sun.media.imageio.plugins.tiff.TIFFImageWriteParam;  
  24.    
  25. public class ImageIOHelper {  
  26.     public ImageIOHelper() {  
  27.     }  
  28.    
  29.     public static File createImage(File imageFile, String imageFormat) {  
  30.        File tempFile = null;  
  31.        try {  
  32.            Iterator<ImageReader> readers = ImageIO.getImageReadersByFormatName(imageFormat);  
  33.            ImageReader reader = readers.next();  
  34.    
  35.            ImageInputStream iis = ImageIO.createImageInputStream(imageFile);  
  36.            reader.setInput(iis);  
  37.            // Read the stream metadata  
  38.            IIOMetadata streamMetadata = reader.getStreamMetadata();  
  39.    
  40.            // Set up the writeParam  
  41.            TIFFImageWriteParam tiffWriteParam = new TIFFImageWriteParam(Locale.US);  
  42.            tiffWriteParam.setCompressionMode(ImageWriteParam.MODE_DISABLED);  
  43.    
  44.            // Get tif writer and set output to file  
  45.            Iterator<ImageWriter> writers = ImageIO.getImageWritersByFormatName("tiff");  
  46.            ImageWriter writer = writers.next();  
  47.    
  48.            BufferedImage bi = reader.read(0);  
  49.            IIOImage image = new IIOImage(bi, null, reader.getImageMetadata(0));  
  50.            tempFile = tempImageFile(imageFile);  
  51.            ImageOutputStream ios = ImageIO.createImageOutputStream(tempFile);  
  52.            writer.setOutput(ios);  
  53.            writer.write(streamMetadata, image, tiffWriteParam);  
  54.            ios.close();  
  55.    
  56.            writer.dispose();  
  57.            reader.dispose();  
  58.        } catch (Exception exc) {  
  59.            exc.printStackTrace();  
  60.        }  
  61.        return tempFile;  
  62.     }  
  63.    
  64.     public static File createImage(BufferedImage bi) {  
  65.        File tempFile = null;  
  66.        try {  
  67.            tempFile = File.createTempFile("tempImageFile", ".tif");  
  68.            tempFile.deleteOnExit();  
  69.            TIFFImageWriteParam tiffWriteParam = new TIFFImageWriteParam(Locale.US);  
  70.            tiffWriteParam.setCompressionMode(ImageWriteParam.MODE_DISABLED);  
  71.    
  72.            // Get tif writer and set output to file  
  73.            Iterator<ImageWriter> writers = ImageIO.getImageWritersByFormatName("tiff");  
  74.            ImageWriter writer = writers.next();  
  75.    
  76.            IIOImage image = new IIOImage(bi, null, null);  
  77.            tempFile = tempImageFile(tempFile);  
  78.            ImageOutputStream ios = ImageIO.createImageOutputStream(tempFile);  
  79.            writer.setOutput(ios);  
  80.            writer.write(null, image, tiffWriteParam);  
  81.            ios.close();  
  82.            writer.dispose();  
  83.        } catch (Exception exc) {  
  84.            exc.printStackTrace();  
  85.        }  
  86.        return tempFile;  
  87.     }  
  88.    
  89.     public static File tempImageFile(File imageFile) {  
  90.        String path = imageFile.getPath();  
  91.        StringBuffer strB = new StringBuffer(path);  
  92.        strB.insert(path.lastIndexOf('.'), 0);  
  93.        return new File(strB.toString().replaceFirst("(?<=//.)(//w+)$", "tif"));  
  94.     }  
  95.    
  96.     public static BufferedImage getImage(File imageFile) {  
  97.        BufferedImage al = null;  
  98.        try {  
  99.            String imageFileName = imageFile.getName();  
  100.            String imageFormat = imageFileName.substring(imageFileName.lastIndexOf('.') + 1);  
  101.            Iterator<ImageReader> readers = ImageIO.getImageReadersByFormatName(imageFormat);  
  102.            ImageReader reader = readers.next();  
  103.    
  104.            if (reader == null) {  
  105.               JOptionPane.showConfirmDialog(null,  
  106.                      "Need to install JAI Image I/O package./nhttps://jai-imageio.dev.java.net");  
  107.               return null;  
  108.            }  
  109.    
  110.            ImageInputStream iis = ImageIO.createImageInputStream(imageFile);  
  111.            reader.setInput(iis);  
  112.    
  113.            al = reader.read(0);  
  114.    
  115.            reader.dispose();  
  116.        } catch (IOException ioe) {  
  117.            System.err.println(ioe.getMessage());  
  118.        } catch (Exception e) {  
  119.            System.err.println(e.getMessage());  
  120.        }  
  121.    
  122.        return al;  
  123.     }  
  124.    
  125.     public static BufferedImage imageToBufferedImage(Image image) {  
  126.        BufferedImage bufferedImage = new BufferedImage(image.getWidth(null), image.getHeight(null),  
  127.               BufferedImage.TYPE_INT_RGB);  
  128.        Graphics2D g = bufferedImage.createGraphics();  
  129.        g.drawImage(image, 0, 0, null);  
  130.        return bufferedImage;  
  131.     }  
  132.    
  133.     public static BufferedImage imageProducerToBufferedImage(ImageProducer imageProducer) {  
  134.        return imageToBufferedImage(Toolkit.getDefaultToolkit().createImage(imageProducer));  
  135.     }  
  136.    
  137.     public static byte[] image_byte_data(BufferedImage image) {  
  138.        WritableRaster raster = image.getRaster();  
  139.        DataBufferByte buffer = (DataBufferByte) raster.getDataBuffer();  
  140.        return buffer.getData();  
  141.     }  
  142. }  

 

Java代码   收藏代码
  1. package com.ocr;  
  2.    
  3. import java.io.BufferedReader;  
  4. import java.io.File;  
  5. import java.io.FileInputStream;  
  6. import java.io.InputStreamReader;  
  7. import java.util.ArrayList;  
  8. import java.util.List;  
  9. import org.jdesktop.swingx.util.OS;  
  10.   
  11. public class OCR {  
  12.     private final String LANG_OPTION = "-l";  
  13.     private final String EOL = System.getProperty("line.separator");  
  14.     private String tessPath = new File("tesseract").getAbsolutePath();  
  15.     //private String tessPath="C://Program Files (x86)//Tesseract-OCR//";  
  16.     public String recognizeText(File imageFile, String imageFormat) throws Exception {  
  17.        File tempImage = ImageIOHelper.createImage(imageFile, imageFormat);  
  18.        File outputFile = new File(imageFile.getParentFile(), "output");  
  19.        StringBuffer strB = new StringBuffer();  
  20.        List<String> cmd = new ArrayList<String>();  
  21.        if (OS.isWindowsXP()) {  
  22.            cmd.add(tessPath + "//tesseract");  
  23.            //cmd.add(tessPath + "//Tesseract-OCR");  
  24.        } else if (OS.isLinux()) {  
  25.            cmd.add("tesseract");  
  26.        } else {  
  27.            //cmd.add(tessPath + "//Tesseract-OCR");  
  28.            cmd.add(tessPath + "//tesseract");  
  29.        }  
  30.            cmd.add("");   
  31.             cmd.add(outputFile.getName());   
  32.             cmd.add(LANG_OPTION);   
  33.             cmd.add("chi_sim");  
  34.             cmd.add("eng");   
  35.    
  36.        ProcessBuilder pb = new ProcessBuilder();  
  37.        pb.directory(imageFile.getParentFile());  
  38.    
  39.        cmd.set(1, tempImage.getName());  
  40.        pb.command(cmd);  
  41.        pb.redirectErrorStream(true);  
  42.        Process process = pb.start();  
  43.        //tesseract.exe 1.jpg 1 -l chi_sim  
  44.        int w = process.waitFor();  
  45.    
  46.        // delete temp working files  
  47.        tempImage.delete();  
  48.    
  49.        if (w == 0) {  
  50.            BufferedReader in = new BufferedReader(new InputStreamReader(new FileInputStream(outputFile  
  51.                   .getAbsolutePath()  
  52.                   + ".txt"), "UTF-8"));  
  53.    
  54.            String str;  
  55.    
  56.            while ((str = in.readLine()) != null) {  
  57.               strB.append(str).append(EOL);  
  58.            }  
  59.            in.close();  
  60.        } else {  
  61.            String msg;  
  62.            switch (w) {  
  63.            case 1:  
  64.               msg = "Errors accessing files. There may be spaces in your image's filename.";  
  65.               break;  
  66.            case 29:  
  67.               msg = "Cannot recognize the image or its selected region.";  
  68.               break;  
  69.            case 31:  
  70.               msg = "Unsupported image format.";  
  71.               break;  
  72.            default:  
  73.               msg = "Errors occurred.";  
  74.            }  
  75.            tempImage.delete();  
  76.            throw new RuntimeException(msg);  
  77.        }  
  78.        new File(outputFile.getAbsolutePath() + ".txt").delete();  
  79.        return strB.toString();  
  80.     }  
  81. }  
 
Java代码   收藏代码
  1. package com.ocr;  
  2.    
  3. import java.io.File;  
  4.    
  5. public class Test {  
  6.    
  7.     /** 
  8.      * @param args 
  9.      */  
  10.     public static void main(String[] args) {  
  11.        // TODO Auto-generated method stub  
  12.        OCR ocr=new OCR();  
  13.         try {  
  14.            String maybe = new OCR().recognizeText(new  File("E://temp//222.jpg"), "jpg");  
  15.            System.out.println(maybe);  
  16.        } catch (Exception e) {  
  17.            // TODO Auto-generated catch block  
  18.            e.printStackTrace();  
  19.        }  
  20.     }  
  21.    
  22. }  

你可能感兴趣的:(java,image,null,语言,IIS,tiff)