java图片缩放二

在使用  java图片缩放一 提供的方法进行图片缩小/放大是出现了 图像两边留白  变形等问题。  通过百度  后来在网上找到了另外一个 缩放图片的方法  他是直接将图片按目标尺寸进缩放 这样虽能解决了上一个方案的图片四边留白的问题  但是 压缩后的图片 还是会变形的,弃之。 

 后来想 能不能先将图片等比例压缩、放大到和目标尺寸相近的尺寸。 能后在进行裁剪。

通过搜索 网上已有这样的解决方案  http://my.oschina.net/u/873047/blog/106551  这里只做记录

  /**
	     * <p>先等比例缩放 能后在进行切割</p>
	     *	原理:将待裁剪图片宽高相除值和目标尺寸宽高相除值进行比较,如果前者较大,说明待裁剪图片相对于目标尺寸来说要宽出一块,现在已高为基准进行裁剪,<br/>
	     *即将原始图片的高度缩放到目标尺寸的高度。计算出原始图片高度和目标尺寸高度的比例,和原始图片宽度相乘,得到缩放后的宽度。<br/>
	     *此时的缩缩放后的高度就是目标尺寸的高度,但是宽度*肯定*会比目标尺寸宽度宽。将缩放后的多余的宽度分为两份右边和左边各裁去一份。<br/>
	     *以宽为基准原理类似。<br/><br/>
	     * @param srcImgPath 待切割图片路径
	     * @param destImgPath 切割后图片路径
	     * @param destImgW 所需宽度
	     * @param destImgH 所需高度
	     */
	    public static void createThumb (String srcImgPath , String destImgPath, int destImgW , int destImgH){
	        //原图片等比例缩小或放大之后的图片
	        int narrowImgW ;
	        int narrowImgH ;
	        //原图片大小
	        int srcImgW ;
	        int srcImgH ;
	        try {
	            BufferedImage bi = ImageIO. read(new File(srcImgPath));
	            srcImgW = bi.getWidth();
	            srcImgH = bi.getHeight();
	            // 转换图片尺寸与目标尺寸比较 , 如果转换图片较小,说明转换图片相对于目标图片来说高较小,需要以高为基准进行缩放。
	            if((float )srcImgW /srcImgH > (float)destImgW / destImgH){
	                narrowImgW = ( int)(((float )destImgH / (float)srcImgH)*srcImgW);
	                narrowImgH = destImgH;
	                //按照原图以高为基准等比例缩放、或放大。这一步高为所需图片的高度,宽度肯定会比目标宽度宽。
	                int cutNarrowImgSize = (narrowImgW - destImgW)/2;
	                BufferedImage narrowImg = new BufferedImage(narrowImgW, narrowImgH,BufferedImage.TYPE_INT_RGB);
	                narrowImg.getGraphics().drawImage(bi.getScaledInstance(narrowImgW, narrowImgH, Image.SCALE_SMOOTH ), 0, 0, null);
	                //等比例缩放完成后宽度与目标尺寸宽度相比较 , 将多余宽的部分分为两份 ,左边删除一部分
	                Image image = narrowImg.getScaledInstance(narrowImgW, narrowImgH, Image.SCALE_DEFAULT );
	                CropImageFilter cropFilter = new CropImageFilter(cutNarrowImgSize, 0, narrowImgW-cutNarrowImgSize, narrowImgH);
	                Image img = Toolkit.getDefaultToolkit().createImage( new FilteredImageSource(image.getSource(), cropFilter));
	                BufferedImage cutLiftNarrowImg = new BufferedImage( narrowImgW-cutNarrowImgSize, narrowImgH,BufferedImage.TYPE_INT_RGB );
	                cutLiftNarrowImg.getGraphics().drawImage(img, 0, 0, null);
	                //右边删除一部分
	                image = cutLiftNarrowImg.getScaledInstance(narrowImgW-cutNarrowImgSize, narrowImgH, Image.SCALE_DEFAULT );
	                cropFilter = new CropImageFilter(0, 0, narrowImgW-cutNarrowImgSize*2, narrowImgH);
	                img = Toolkit.getDefaultToolkit().createImage( new FilteredImageSource(image.getSource(), cropFilter));
	                BufferedImage cutRightNarrowImg = new BufferedImage( narrowImgW-cutNarrowImgSize*2, narrowImgH,BufferedImage.TYPE_INT_RGB );
	                Graphics g = cutRightNarrowImg.getGraphics();
	                g.drawImage(img, 0, 0, null); // 绘制截取后的图
	                g.dispose();
	                //输出为文件 最终为所需要的格式
	                ImageIO. write(cutRightNarrowImg, "JPEG", new File(destImgPath));
	            }
	            else{ //以宽度为基准
	                narrowImgW = destImgW;
	                narrowImgH = ( int) (((float )destImgW / (float)srcImgW)*srcImgH);
	                int cutNarrowImgSize = (narrowImgH - destImgH)/2;

	                BufferedImage narrowImg = new BufferedImage(narrowImgW, narrowImgH,BufferedImage.TYPE_INT_RGB);
	                narrowImg.getGraphics().drawImage(bi.getScaledInstance(narrowImgW, narrowImgH, Image.SCALE_SMOOTH ), 0, 0, null);

	                Image image = narrowImg.getScaledInstance(narrowImgW, narrowImgH, Image.SCALE_DEFAULT );
	                CropImageFilter cropFilter = new CropImageFilter(0, cutNarrowImgSize, narrowImgW, narrowImgH-cutNarrowImgSize);
	                Image img = Toolkit.getDefaultToolkit().createImage( new FilteredImageSource(image.getSource(), cropFilter));
	                BufferedImage cutTopNarrowImg = new BufferedImage( narrowImgW, narrowImgH-cutNarrowImgSize,BufferedImage. TYPE_INT_RGB);
	                cutTopNarrowImg.getGraphics().drawImage(img, 0, 0, null);

	                image = cutTopNarrowImg.getScaledInstance(narrowImgW, narrowImgH-cutNarrowImgSize, Image. SCALE_DEFAULT);
	                cropFilter = new CropImageFilter(0, 0, narrowImgW, narrowImgH-cutNarrowImgSize*2);
	                img = Toolkit.getDefaultToolkit().createImage( new FilteredImageSource(image.getSource(), cropFilter));
	                BufferedImage cutBottomNarrowImg = new BufferedImage( narrowImgW, narrowImgH-cutNarrowImgSize*2,BufferedImage. TYPE_INT_RGB);
	                Graphics g = cutBottomNarrowImg.getGraphics();
	                g.drawImage(img, 0, 0, null);
	                g.dispose();
	                ImageIO. write(cutBottomNarrowImg, "JPEG", new File(destImgPath));
	            }
	        } catch (IOException e) {
	            e.printStackTrace();
	        }
	    }


改进

在对图片的高进行切割的时候。 上下都切割的话 ,有可能会把人物的头切掉。 为了美观, 这里就不采用上下各切一般的方法了  改为 只切底部 保留上部。

方法就是修改下else 中的代码

<span style="white-space:pre">			</span>narrowImgW = destImgW;
	                narrowImgH = ( int) (((float )destImgW / (float)srcImgW)*srcImgH);
	                int cutNarrowImgSize = (narrowImgH - destImgH);

	                BufferedImage narrowImg = new BufferedImage(narrowImgW, narrowImgH,BufferedImage.TYPE_INT_RGB);
	                narrowImg.getGraphics().drawImage(bi.getScaledInstance(narrowImgW, narrowImgH, Image.SCALE_SMOOTH ), 0, 0, null);
	                
	                // 创建此图像的缩放版本
	                Image image = narrowImg.getScaledInstance(narrowImgW, narrowImgH, Image.SCALE_DEFAULT);
	               //裁剪图像
	                CropImageFilter cropFilter = new CropImageFilter(0, 0, narrowImgW, narrowImgH-cutNarrowImgSize);
	                Image img = Toolkit.getDefaultToolkit().createImage( new FilteredImageSource(image.getSource(), cropFilter));
	                BufferedImage cutBottomNarrowImg = new BufferedImage( narrowImgW, narrowImgH-cutNarrowImgSize,BufferedImage.TYPE_INT_RGB);
	                Graphics g = cutBottomNarrowImg.getGraphics();
	                g.drawImage(img, 0, 0, null);
	                g.dispose();
	                ImageIO.write(cutBottomNarrowImg, "JPEG", new File(destImgPath));


源图:

等比例缩小切割后生成一个155*105的图片
改进前


改进后



原文链接: http://my.oschina.net/u/873047/blog/106551

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值