读取服务器中的图片,旋转后保存服务器,替换原图片

时间:2022-11-20 21:46:59

图片前台页面旋转,实际上前台的旋转是假的,真正的旋转时在后台,把图片路劲和旋转的角度传给后台,在后台操作,

前台显示图片旋转需要到包jquery.rotate.min.js,可以自己去下载,找不到的可以加我QQ512594735发给你


//html代码

双击页面图片,弹出一个窗口,在窗口中打开图片

 <div id="win5" class="easyui-window" title="照片编辑" style="width:500px;height:460px;background:#F1FDFF;"   
        data-options="modal:true, closed:true,minimizable:false,collapsible:false,maximizable:false">
        <div style="height: 360;text-align: center;margin-top:10px;">
        <img id="photob" src="" height="360" /> <!-- 定义一个图片路劲-->
        </div>  
        <div style="margin-top:20px;">
        <div style="margin-left: 15%;float: left;">
        <a  id="win5_rotate"  class="easyui-linkbutton"  data-options="iconCls:'icon-arrow_rotate_clockwise'">旋转</a>
        </div>
         <div style="margin-right:5%;float:right;">
        <a  id="win5_ok"  class="easyui-linkbutton"  data-options="iconCls:'icon-ok'">保存</a>
        <a  id="win5_cancel"  class="easyui-linkbutton"  data-options="iconCls:'icon-cancel'">取消</a>
         </div>
 
        </div>
</div>


js代码

 var num=0;

双击图片在弹窗中显示

        $("#photo0").dblclick(function(){
            num = 0;
            $('#photob').rotate(0);//每次打开图片先把旋转清空,否则新打开图片会按之前角度自动旋转
            var id=this.id;
            var src=$("#"+id).attr("src");
            $("#photob").attr("src",src);
            $("#win5").window("open");
        });


        //旋转图片弹窗,旋转
        $("#win5_rotate").click(function(){
            num++;
            $('#photob').rotate(num*90);
        });
        
        //旋转图片弹窗,保存
        $("#win5_ok").click(function(){

            var src=$("#photob").attr("src");
            var angle=num*90;
            $.post("rotatePhoto.html",
                    { src: src, angle: angle },
                       function(data){
                         alert("Data Loaded: " + data);
                       });
        });
        //旋转图片弹窗,取消
        $("#win5_cancel").click(function(){            
            $("#win5").window("close");
        });


后台java代码


@Controller
@RequestMapping(value="/main/")
public class Rotatephoto {
    @Autowired
  private HttpServletRequest request;
    
    /**
     * 把服务器中照片旋转一定角度,在保存到服务器
 
     * @return
     */
    @RequestMapping(value="rotatePhoto")
     @ResponseBody
    public String rotatePhoto(String src,int angle){
        String fhz="cg";
        BufferedImage bufferedimage=null;
        OutputStream out=null;
        try {//从服务器读取照片
            
              int h = 0;
              int w = 0;
              bufferedimage = ImageIO.read(new URL(src));//从服务器中读取照片,用new URL(),读取本地磁盘中照片用new File()
              if(angle!=0){//旋转角度不等于零
                        if(angle / 90%2 ==1){//旋转角度为90或270...时,图像的长款对换
                             h = bufferedimage.getWidth();
                             w = bufferedimage.getHeight();
                        }else{
                             w = bufferedimage.getWidth();
                             h = bufferedimage.getHeight();
                        }      
                }else {//旋转角度为0时,返回
                    return fhz;
                }
                int type = bufferedimage.getColorModel().getTransparency();//将像素值转换为颜色分量和 alpha 分量的方法,返回此 ColorModel 的转换类型。
                BufferedImage img;
                img = new BufferedImage(w, h, type);
                Graphics2D graphics2d = img.createGraphics();//创建一个 Graphics2D,可以将它绘制到此 BufferedImage 中。
                graphics2d.translate((w-bufferedimage.getWidth())/2, (h-bufferedimage.getHeight())/2);//将当前 Graphics2D Transform 与平移转换连接。后续呈现相对于前一位置平移指定的距离。
                graphics2d.setRenderingHint(
                        RenderingHints.KEY_INTERPOLATION,//插值提示键
                        RenderingHints.VALUE_INTERPOLATION_BILINEAR);//插值提示值——图像中最接近整数坐标样本的 4 种颜色样本被线性地插入,以生成一个颜色样本
                graphics2d.rotate(Math.toRadians(angle), bufferedimage.getWidth() / 2, bufferedimage.getHeight() / 2);//注意此处是员图片的宽和长,不是计算后的,用计算后的宽和长,保存后又黑边,因为此处错误找了三四个小时
                graphics2d.drawImage(bufferedimage, null, null);
                graphics2d.dispose();
                
                //把旋转后照片存入服务器
                Assert.assertNotNull(img);                
                String url=request.getServletContext().getRealPath("upload") ;//获取服务器upload路劲
                String imageName=src.substring(src.lastIndexOf("/")+1);//从照片全路径中解析照片名称
                out=new FileOutputStream(url+"/apptake/"+imageName);//创建一个文件输出流
                Assert.assertTrue(ImageIO.write(img, "jpg", out));
               
        } catch (IOException e) {
            fhz="yc";
            e.printStackTrace();
        }finally{
            if(out!=null){
                try {
                    out.close();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            
        }
        
      
        return fhz;
        
        
        
    }
    
    
}

已上代码可以实现把图片从服务器中读到前台页面,页面旋转图片,保存后java后台把照片读取到,处理后在存入服务器替换原来照片