java的圖像縮略方法

圖像的縮略代碼


                    
// 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();

 

把圖片轉成灰度圖

 

private  BufferedImage getGrayImage(BufferedImage image){
        BufferedImage dstimage
= new  BufferedImage(image.getWidth(),image.getHeight(),image.getType());
        Graphics2D g2
= dstimage.createGraphics();
        RenderingHints hints
= g2.getRenderingHints();
        g2.dispose();
        g2
= null ;
        ColorSpace grayCS
= ColorSpace.getInstance(ColorSpace.CS_GRAY);
        ColorConvertOp colorConvertOp
= new  ColorConvertOp(grayCS,hints);
        colorConvertOp.filter(image, dstimage);
        
return  dstimage;
    }


 

 

 

posted on 2008-11-04 15:49 waya 阅读( ...) 评论( ...) 编辑 收藏

转载于:https://www.cnblogs.com/waya/archive/2008/11/04/1326402.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值