本文转载自:
http://www.cnblogs.com/waya/archive/2008/11/04/1326402.html
圖像的縮略代碼
//Image image = ImageIO.read(is); Image src=Toolkit.getDefaultToolkit().getImage(file.getPath());//可讀取丟失ICC信息的圖片 BufferedImage image=BufferedImageBuilder.toBufferedImage(src);//Image to BufferedImage int w=image.getWidth(null); int h=image.getHeight(null); //縮略圖的size int size=getFileSize(flag); if(size==0)size=h; int nw=size; int nh=(nw*h)/w; if(nh>size){ nh=size; nw=(nh*w)/h; } BufferedImage tag=new BufferedImage(nw,nh,BufferedImage.TYPE_INT_RGB); tag.getGraphics().drawImage(image.getScaledInstance(nw, nh, Image.SCALE_SMOOTH), 0, 0, null); FileOutputStream out=new FileOutputStream(imageFile); JPEGImageEncoder encoder=JPEGCodec.createJPEGEncoder(out); encoder.encode(tag); out.close();
以下是Image轉換BufferedImage代碼
public static BufferedImage toBufferedImage(Image image) { if (image instanceof BufferedImage) { return (BufferedImage)image; } // This code ensures that all the pixels in the image are loaded image = new ImageIcon(image).getImage(); // Determine if the image has transparent pixels; for this method's // implementation, see e661 Determining If an Image Has Transparent Pixels //boolean hasAlpha = hasAlpha(image); // Create a buffered image with a format that's compatible with the screen BufferedImage bimage = null; GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); try { // Determine the type of transparency of the new buffered image int transparency = Transparency.OPAQUE; /* if (hasAlpha) { transparency = Transparency.BITMASK; }*/ // Create the buffered image GraphicsDevice gs = ge.getDefaultScreenDevice(); GraphicsConfiguration gc = gs.getDefaultConfiguration(); bimage = gc.createCompatibleImage( image.getWidth(null), image.getHeight(null), transparency); } catch (HeadlessException e) { // The system does not have a screen } if (bimage == null) { // Create a buffered image using the default color model int type = BufferedImage.TYPE_INT_RGB; //int type = BufferedImage.TYPE_3BYTE_BGR;//by wang /*if (hasAlpha) { type = BufferedImage.TYPE_INT_ARGB; }*/ bimage = new BufferedImage(image.getWidth(null), image.getHeight(null), type); } // Copy image to buffered image Graphics g = bimage.createGraphics(); // Paint the image onto the buffered image g.drawImage(image, 0, 0, null); g.dispose(); return bimage; }
以上的方法可以生成品質較高無鋸齒的新圖像文件
還有以下方法生成縮略圖的,如果是圖像失真較大, 圖形可以用以下方法
//BufferedImage src = ImageIO.read(is); Image image=Toolkit.getDefaultToolkit().getImage(file.getPath());//用它可以讀取丟失ICC信息的圖片 BufferedImageBuilder bib=new BufferedImageBuilder(); BufferedImage src=BufferedImageBuilder.toBufferedImage(image); //BufferedImage src=bib.bufferImage(image); int w=src.getWidth(); int h=src.getHeight(); int size=getFileSize(flag); if(size==0)size=h; int nw=size; int nh=(nw*h)/w; if(nh>size){ nh=size; nw=(nh*w)/h; } //縮圖的比例 double sx=(double)nw/w; double sy=(double)nh/h; AffineTransform transform=new AffineTransform(); transform.setToScale(sx, sy); AffineTransformOp ato=new AffineTransformOp(transform,null); int type=src.getColorModel().getColorSpace().getType(); if(type==5){ //type=BufferedImage.TYPE_3BYTE_BGR; type=BufferedImage.TYPE_INT_RGB; }else if(type==6){ type=BufferedImage.TYPE_BYTE_GRAY; } BufferedImage tag=new BufferedImage(nw, nh,type); ato.filter(src, tag); if(isGray&&type!=6){ //生成灰色圖片 tag=getGrayImage(tag); } ImageIO.write(tag, "jpeg", imageFile); tag.flush(); src.flush(); is.close();
-----------------------------------------分隔线(以下非转载内容)----------------------------------------------
我在做生成缩略图时,发现了有些图片生成后会蒙上一层红色的图层,变色变得很难看,在网上搜索了一下,于是发现了上面那段代码,解决了那个问题,但是听说在Linux上会报错,这个我还没试过,有试过的兄弟麻烦给个回复~
本文转载自:
http://www.cnblogs.com/waya/archive/2008/11/04/1326402.html