锁定老帖子 主题:用JAVA生成缩图后图片不清楚了怎么解决!
精华帖 (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(); } } |
|
返回顶楼 | |
发表时间:2006-12-27
呵呵,唉,难道就没有办法吗,javaeye的图片好象就是缩小可以的不知道是怎么作的哦!
|
|
返回顶楼 | |
发表时间:2006-12-27
以前没用过缩小 只用过放大 以为一样呢
郁闷 和楼主共同关注 |
|
返回顶楼 | |
发表时间: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 不太确定 效果差不多 但是算法不一样 具体哪个算法更好 我也忘了 |
|
返回顶楼 | |
发表时间:2006-12-27
谢谢fins!
我试了Image.SCALE_AREA_AVERAGING,Image.SCALE_AREA_AVERAGING,Image.SCALE_SMOOTH这两个没什么区别,文件大小,和效果都一样,跟其他的相比效果是最好的。其他三种文件都略大,而且效果差多了,可能压缩速度快些?从名字猜的。 |
|
返回顶楼 | |
发表时间:2006-12-28
啊!终于得到满意答按了!
|
|
返回顶楼 | |
发表时间:2006-12-28
谢谢fins,我也把我的实现改了一下,效果不错。不过发现很奇怪,原来画质差的Jpg文件的大小比现在清晰的还要大一些,看来Image.SCALE_SMOOTH这种算法的压缩比挺高的。
|
|
返回顶楼 | |
发表时间:2006-12-28
我后来试验了一下
对图片的缩放一定要用 Image下的 getScaledInstance Graphics下的 还有 AffineTransform下的 缩放都是针对"图形"而不是"图像"的 图形就是用java类画的线条等简单几何图形 |
|
返回顶楼 | |
发表时间:2007-06-20
怎么去规定你要缩图的大小呢?
|
|
返回顶楼 | |
发表时间:2007-06-20
那是因为强制压缩造成像素堆积的原因,我们用ImageMagic压缩的
|
|
返回顶楼 | |