最近在做一个上传图片后,对该图片进行截图的功能
客户那边给的是5000+ * 3000+的分辨率高清图片,但是一截图后,截完的图片会出现一些锯齿,java有没有一种截图的方法
能不出现锯齿的。。
截图代码如下 public static void alterSize(String srcImgFile, String savePath, int new_w,int new_h) {
File file = new File(srcImgFile);
if (!file.exists())
System.out.println("文件不存在");
String newUrlName = savePath;// 截完过后存放的路径
Image src = null;
try {
src = javax.imageio.ImageIO.read(file);
java.awt.image.BufferedImage tag = new java.awt.image.BufferedImage(
new_w, new_h, java.awt.image.BufferedImage.TYPE_INT_RGB);
tag.getGraphics().drawImage(src, 0, 0, new_w, new_h, null);
FileOutputStream newimage = new FileOutputStream(newUrlName);
ImageIO.write(tag,"jpg",new File(newUrlName ));
newimage.close(); } catch (IIOException ee) {
ee.printStackTrace();
System.out.print("这里出错了");
} catch (Exception e) {
e.printStackTrace();
}
}

解决方案 »

  1.   


    tag.getGraphics().drawImage(src, 0, 0, new_w, new_h, null);
    这里不就是截取src的部分吗
      

  2.   


    对啊 这个是缩略的方法并没有截图啊 
    使用Graphics2D 做抗锯齿应该可以吧 Graphics2D g2d = (Graphics2D)tag.getGraphics();
    g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
    g2d.drawImage(src, 0, 0, new_w, new_h, null);
      

  3.   

    试试tag.getGraphics().drawImage(
    bi.getScaledInstance(width, height,
    Image.SCALE_AREA_AVERAGING), 0, 0, null);
      

  4.   

    /**
     * 图片缩小
     * @param imgsrc     原图片路径
     * @param imgdist    缩小后的图片路径
     * @param widthdist  宽度
     * @param heightdist 高度
     */
    public static void reduceImg(String imgsrc, String imgdist, int widthdist, int heightdist) {   
        try {   
            File srcfile = new File(imgsrc);   
            if (!srcfile.exists()) {   
                return;   
            }   
            Image src = javax.imageio.ImageIO.read(srcfile);   
            BufferedImage tag= new BufferedImage((int) widthdist, (int) heightdist,BufferedImage.TYPE_INT_RGB);   
            tag.getGraphics().drawImage(src.getScaledInstance(widthdist, heightdist,  Image.SCALE_SMOOTH), 0, 0,  null);   
            FileOutputStream out = new FileOutputStream(imgdist);   
            JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);   
            encoder.encode(tag);   
            out.close();   
      
        } catch (IOException ex) {   
            ex.printStackTrace();   
        }   
    }  
    测试方式
    public static void main(String trg[])
    {
    LessenImage l=new LessenImage();
    String imgsrc="D:/cdgxManFaceImage/Fet_load/200912211732010968101.JPG";
    String imgdist="D:/cdgxManFaceImage/Fet_load/Fet_source/200912211732010968101";
    l.reduceImg(imgsrc, imgdist, 400, 300);
    }
      /**
     * 对图片实现剪裁
     * @author Administrator
     *
     */
    public class OperateImage {
     //===源图片路径名称如:c:\1.jpg 
        private String srcpath ;      
        //===剪切图片存放路径名称.如:c:\2.jpg
        private String subpath ;
        //===剪切点x坐标
        private int x ;
        private int y ;    
        //===剪切点宽度
        private int width;
         
        private int height;
        
        public OperateImage(){
                
        }  
        public OperateImage(int x,int y,int width,int height){
             this.x = x ;
             this.y = y ;
             this.width = width ;   
             this.height = height ;
        }
        
        /** *//** 
         * 对图片裁剪,并把裁剪完蛋新图片保存 。
         */
        public void cut() throws IOException{ 
             
            FileInputStream is = null ;
            ImageInputStream iis =null ;    
            try{   
                //读取图片文件
                is = new FileInputStream(srcpath);         
                /**//*
                 * 返回包含所有当前已注册 ImageReader 的 Iterator,这些 ImageReader 
                 * 声称能够解码指定格式。 参数:formatName - 包含非正式格式名称 .
                 *(例如 "jpeg" 或 "tiff")等 。 
                 */
                Iterator<ImageReader> it = ImageIO.getImageReadersByFormatName("jpg");  
                ImageReader reader = it.next(); 
                //获取图片流 
                iis = ImageIO.createImageInputStream(is);               
                /**//* 
                 * <p>iis:读取源.true:只向前搜索 </p>.将它标记为 ‘只向前搜索’。
                 * 此设置意味着包含在输入源中的图像将只按顺序读取,可能允许 reader
                 *  避免缓存包含与以前已经读取的图像关联的数据的那些输入部分。
                 */
                reader.setInput(iis,true) ;            
                /**//* 
                 * <p>描述如何对流进行解码的类<p>.用于指定如何在输入时从 Java Image I/O 
                 * 框架的上下文中的流转换一幅图像或一组图像。用于特定图像格式的插件
                 * 将从其 ImageReader 实现的 getDefaultReadParam 方法中返回 
                 * ImageReadParam 的实例。  
                 */
                ImageReadParam param = reader.getDefaultReadParam();   
                /**//*
                 * 图片裁剪区域。Rectangle 指定了坐标空间中的一个区域,通过 Rectangle 对象
                 * 的左上顶点的坐标(x,y)、宽度和高度可以定义这个区域。 
                 */ 
                Rectangle rect = new Rectangle(x, y, width, height);   
                //提供一个 BufferedImage,将其用作解码像素数据的目标。 
                param.setSourceRegion(rect); 
                /**//*
                 * 使用所提供的 ImageReadParam 读取通过索引 imageIndex 指定的对象,并将
                 * 它作为一个完整的 BufferedImage 返回。
                 */
                BufferedImage bi = reader.read(0,param);                
                //保存新图片 
                ImageIO.write(bi, "jpg", new File(subpath));  
                //删除原图片
                new File(srcpath).delete();
            }
            
            finally{
                if(is!=null)
                   is.close() ;       
                if(iis!=null)
                   iis.close();  
            } 
            
             
         
        }    public int getHeight() {
            return height;
        }    public void setHeight(int height) {
            this.height = height;
        }    public String getSrcpath() {
            return srcpath;
        }    public void setSrcpath(String srcpath) {
            this.srcpath = srcpath;
        }    public String getSubpath() {
            return subpath;
        }    public void setSubpath(String subpath) {
            this.subpath = subpath;
        }    public int getWidth() {
            return width;
        }    public void setWidth(int width) {
            this.width = width;
        }    public int getX() {
            return x;
        }    public void setX(int x) {
            this.x = x;
        }    public int getY() {
            return y;
        }    public void setY(int y) {
            this.y = y;
        } 
        //测试方式
        public static void main(String[] args)throws Exception{
            String name = "D:/cdgxManFaceImage/Fet_load/200912211732010968101.JPG"; 
            OperateImage o = new OperateImage(1000,1000,100,100);
            o.setSrcpath(name);  
            o.setSubpath("D:/2.jpg");
            o.cut() ;  
              
        }