转载自 BufferedInputStream与ImageInputStream
BufferedInputStream读取图片文件(jpg格式),但是图片大小在1M到200M之间都有,由于图片太大,不知道怎么处理好,谢谢各位大哥大姐教教小弟,现在只能读取1M以下读图片,但要求是需要读取1M到200M的大图片
下面是方法的代码:
public String changeImg2(String filename){ //ImgRotate ir = new ImgRotate();String result="";File file1 = new File(filename);BufferedImage image = null; int height =0;int width =0;try { // image = ImageIO.read(file1); //int width = image.getWidth();// int height = image.getHeight();//ImgRotate ir = new ImgRotate();Iterator readers = null;if((filename.substring(filename.lastIndexOf(".")+1).equals("jpg"))){readers = ImageIO.getImageReadersByFormatName( "jpg"); }else if((filename.substring(filename.lastIndexOf(".")+1).equals("bmp"))){readers = ImageIO.getImageReadersByFormatName( "bmp"); }else if((filename.substring(filename.lastIndexOf(".")+1).equals("jpeg"))){readers = ImageIO.getImageReadersByFormatName( "jpeg"); }else if((filename.substring(filename.lastIndexOf(".")+1).equals("gif"))){readers = ImageIO.getImageReadersByFormatName( "gif"); }ImageReader reader = (ImageReader)readers.next(); try { // FileInputStream source = new FileInputStream(filename);//your image path // FileReader source= new FileReader(filename);//InputStream source=new DataInputStream(new BufferedInputStream(new FileInputStream(filename)));BufferedInputStream source = new BufferedInputStream(new FileInputStream(filename));ImageInputStream iis= ImageIO.createImageInputStream(source); reader.setInput(iis,true); height = reader.getHeight(0); width = reader.getWidth(0); result=String.valueOf(width)+","+String.valueOf(height);reader.dispose(); iis.close(); source.close(); if(width>height){rotateImage(file1,90);}System.out.println("width="+width);System.out.println("height="+height);} catch(Exception e) { e.printStackTrace();System.out.println(e.getMessage()); }} catch (Exception e) { e.printStackTrace(); } return result;
1.有一个库你尝试用一下吧?thumbnailator-0.4.3.jar
2.纯java处理图片只能开大内存,吧虚拟机内存开到1G去,java处理图片全部都是在内存里的。有个VolatileImage据说可以利用显存,但是我曾经试过的效果还不如bufferedimage。
当然最好的办法就是分块读取、分块处理,这样最怕1G的图片也没有任何问题,不过算法就比较复杂了。