论坛首页 Java企业应用论坛

用JAVA生成缩图后图片不清楚了怎么解决!

浏览 23355 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2006-12-27  
郁闷啊 放大可以
缩小不行 缩小后略有提高 但还是很差劲 

	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);
			int width = src.getWidth(null);
			int height = src.getHeight(null);

			if (width == widthdist && height == heightdist) {
				FileUtils.copyFile(new File(imgsrc), new File(imgdist));
				return;
			}
			

			double ws = (double) widthdist / (double) width;
			
			double hs = (double) heightdist / (double) height;
			
			BufferedImage tag=null;

			tag = new BufferedImage((int) widthdist, (int) heightdist,
					BufferedImage.TYPE_INT_RGB);
			
			Graphics2D g2d=(Graphics2D)tag.getGraphics();
			
			AffineTransform at=AffineTransform.getScaleInstance(ws,hs);
			RenderingHints qualityHints = new RenderingHints(RenderingHints.KEY_ANTIALIASING,  RenderingHints.VALUE_ANTIALIAS_ON);    
			g2d.transform(at);
			qualityHints.put(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);  
			qualityHints.put(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);   
//			qualityHints.put(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_NEAREST_NEIGHBOR);  
//			qualityHints.put(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
			qualityHints.put(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC);
			 
			g2d.setRenderingHints(qualityHints); 
			
			g2d.drawImage(src, 0, 0,  null);

			FileOutputStream out = new FileOutputStream(imgdist);
			JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
			encoder.encode(tag);
			out.close();

		} catch (IOException ex) {
			ex.printStackTrace();
		}
	}
0 请登录后投票
   发表时间:2006-12-27  
呵呵,唉,难道就没有办法吗,javaeye的图片好象就是缩小可以的不知道是怎么作的哦!
0 请登录后投票
   发表时间:2006-12-27  
以前没用过缩小 只用过放大 以为一样呢
郁闷
和楼主共同关注
0 请登录后投票
   发表时间:2006-12-27  
搞定了
	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);
////			tag.getGraphics().drawImage(src.getScaledInstance(widthdist, heightdist,  Image.SCALE_AREA_AVERAGING), 0, 0,  null);
			
			FileOutputStream out = new FileOutputStream(imgdist);
			JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
			encoder.encode(tag);
			out.close();

		} catch (IOException ex) {
			ex.printStackTrace();
		}
	}

其中是使用 Image.SCALE_SMOOTH 还是使用 SCALE_AREA_AVERAGING
不太确定 效果差不多
但是算法不一样 具体哪个算法更好 我也忘了
0 请登录后投票
   发表时间:2006-12-27  
谢谢fins!
我试了Image.SCALE_AREA_AVERAGING,Image.SCALE_AREA_AVERAGING,Image.SCALE_SMOOTH这两个没什么区别,文件大小,和效果都一样,跟其他的相比效果是最好的。其他三种文件都略大,而且效果差多了,可能压缩速度快些?从名字猜的。
0 请登录后投票
   发表时间:2006-12-28  
啊!终于得到满意答按了!
0 请登录后投票
   发表时间:2006-12-28  
谢谢fins,我也把我的实现改了一下,效果不错。不过发现很奇怪,原来画质差的Jpg文件的大小比现在清晰的还要大一些,看来Image.SCALE_SMOOTH这种算法的压缩比挺高的。
0 请登录后投票
   发表时间:2006-12-28  
我后来试验了一下
对图片的缩放一定要用   Image下的 getScaledInstance

Graphics下的 还有 AffineTransform下的 缩放都是针对"图形"而不是"图像"的

图形就是用java类画的线条等简单几何图形
0 请登录后投票
   发表时间:2007-06-20  
怎么去规定你要缩图的大小呢?
0 请登录后投票
   发表时间:2007-06-20  
那是因为强制压缩造成像素堆积的原因,我们用ImageMagic压缩的
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics