自己找的一个旋转图片的方法已经写成JSP方式了,但是旋转任意角度后有些失真,求解决方法或替换方法,谢谢各位了,5555555555555<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ page language="java" import="java.awt.BasicStroke"%>
<%@ page language="java" import="java.awt.Graphics2D" %>
<%@ page language="java" import="java.awt.RenderingHints" %>
<%@ page language="java" import="java.awt.geom.AffineTransform"%>
<%@ page language="java" import="java.awt.image.BufferedImage"%>
<%@ page language="java" import="java.io.File" %>
<%@ page language="java" import="java.io.IOException" %>
<%@ page language="java" import="javax.imageio.ImageIO"%><% 
String fileName = request.getParameter("fileName");
int angle = Integer.parseInt(request.getParameter("angle"));
String path = getServletContext().getRealPath("").replace("\\","/");

AffineTransform trans = null;
trans = new AffineTransform();
String filePath = path+"/images/"+fileName;
//response.getWriter().write(filePath);
File f = new File(filePath);
BufferedImage buffimg = ImageIO.read(f);   
int w = buffimg.getWidth();
int h = buffimg.getHeight();
Graphics2D g2 = buffimg.createGraphics();
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,   
            RenderingHints.VALUE_ANTIALIAS_ON);
trans.rotate(Math.toRadians(angle),w/2,h/2);
g2.setTransform(trans);
g2.setStroke(new BasicStroke(100.0f));//粗细
g2.drawImage(buffimg, null, null);
g2.dispose();
ImageIO.write(buffimg, "png", response.getOutputStream());
buffimg.flush();
%>

解决方案 »

  1.   

    BufferedImage的旋转只是最简单的旋转,使用的是最简单的最临近元素,没有通过双线性过滤,三线性过滤算法来旋转,缩放图片,所以效果不好,可以自己实现这个算法
      

  2.   

    我错了,在Java里可以设置过滤算法的,下面是代码片段
                @Override
                public void paintComponent(Graphics g) {
                    setBackground(Color.DARK_GRAY);
                    super.paintComponent(g);
                    Graphics2D g2d = (Graphics2D) g;
                    g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
                        RenderingHints.VALUE_INTERPOLATION_BILINEAR); // 这里使用双线性过滤插件算法                g2d.translate(0, 300);
                    g2d.rotate(Math.toRadians(-30));
                    g2d.drawImage(img, 0, 0, img.getWidth(this), img.getHeight(this), null);
                }
      

  3.   

    [email protected]期待中………………
      

  4.   

    g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
                        RenderingHints.VALUE_INTERPOLATION_BILINEAR); // 这里使用双线性过滤插件算法这种过滤方法旋转基本可以,边缘稍微有些柔化,不过还能接受,哈哈,非常感谢!
      

  5.   

    双线性过滤满足不了你的要求,那可以如下使用三线性过滤算法:
    g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
                        RenderingHints.VALUE_INTERPOLATION_BICUBIC);
      

  6.   

    恩,谢谢各位大大,不过还有一个问题,g2.drawImage(buffimg, null, null);
    他是将buffimg的数据处理后又叠加到原图上去了,这就导致如果背景是透明的话,经过处理的图片就是2张图片的叠加了,请问这个问题该如何处理??
      

  7.   

    创建BufferedImage的时候,不要使用Alpha通道,就可以创建一个不透明的图片,如
    BufferedImage bufImg = new BufferedImage(299, 299, BufferedImage.TYPE_INT_RGB);
      

  8.   

    在一个透明的BufferedImage上旋转,再保存这个透明的图片就可以了。
      

  9.   

    这样会在原来的图片上又覆盖一层,g2.drawImage(buffimg, null, null);
    导致是2张图片叠加在一起!!!