FaustCplus

问题简介

项目中要用到头像上传组件,能够剪切并生成缩略图。在网上找到一大圈,大多数都是要Money的,虽然可以免费使用,但是都是有水印。最终找到了FaustCplus,不但免费无水印,而且提供了源码,推荐有需要的人使用。

但是由于作者提供的是后台php代码来处理图片的,换成java试了很多方式来接受图片,比如通过fileupload组件,但是都不可行,主要传输协议类型不是formdata,通过chrome查看后台传输,Content-Type=octet-stream,并且实际后台只传输了一张图片——剪裁后的第一张图片。看来,只能通过java的ImageIO来处理,并且后台进行压缩了。

前台处理

我的处理方式是将pSize参数的值一起传到后台(注:uploadUrl后面只能带一个参数,并且参数中不能包括|),所以需要将pSize中间的|换成其他字符串,例如一个简单字母p,所以构成uploadUrl=uploadServlet?size=120p120p60p60p30p30p。具体代码如下:

Js代码 复制代码  收藏代码
  1. <object id="FaustCplus" data="FaustCplus/FaustCplus.swf" type="application/x-shockwave-flash" width="650" height="500">   
  2.         <param value="false" name="menu" />           
  3.         <param value="noScale" name="scale" />   
  4.         <param value="true" name="allowFullscreen" />   
  5.         <param value="always" name="allowScriptAccess" />   
  6.         <param value="transparent" name="wmode" />   
  7.         <param value="#FFFFFF" name="bgcolor" />   
  8.         <param value="pSize=300|300|100|100|40|40&amp;jsfunc=uploadevent&amp;imgUrl=test.jpg&amp;pid=75642723&amp;uploadSrc=true&amp;showBrow=true&amp;showCame=true&amp;uploadUrl=UploadServlet?size=300p300p100p100p40p40p" name="flashvars" /></object>  

 

后台处理

后台通过java的ImageIO来接收文件流,获取到第一张图片BufferedImage,然后保存第一张图片,同时根据传递的size压缩后面两张图片。具体代码如下:

    • servlet获取参数并处理代码:
    • Java代码 复制代码  收藏代码
      1. protected void doGet(HttpServletRequest request,   
      2.             HttpServletResponse response) throws ServletException, IOException {   
      3.              
      4.            
      5.         String size = request.getParameter("size");   
      6.         int status;   
      7.         if(null==size||"".equals(size)){   
      8.             status=-1;   
      9.         }   
      10.         String[] sizes = size.split("p");   
      11.         if(sizes.length%2!=0){//必须确保有宽度和高度   
      12.            status=-2;   
      13.         }   
      14.         File file1 = new File("c://"+sizes[0]+"_"+sizes[1]+".jpg");//通过宽度和高度来命名   
      15.         ImageInputStream ii = ImageIO.createImageInputStream(request   
      16.                 .getInputStream());   
      17.     
      18.         BufferedImage br = ImageIO.read(ii);   
      19.         try {   
      20.             if (!file1.exists()) {   
      21.                 file1.createNewFile();   
      22.             }   
      23.             // 将BufferedImage变量写入文件中。   
      24.             ImageIO.write(br, "jpg", file1);   
      25.         } catch (IOException e) {   
      26.             e.printStackTrace();   
      27.         }   
      28.         int width=0,height=0;   
      29.         File dest = null;    
      30.        for(int i = 2;i&lt;sizes.length;i++){   
      31.              if(i%2==0){   
      32.                   width=Integer.parseInt(sizes[i]);   
      33.              }else{   
      34.                   height=Integer.parseInt(sizes[i]);   
      35.                   String filename="c://"+width+"_+"height+".jpg"  
      36.                   dest = new File(filename);   
      37.                   compressPic(image,dest,width,height);   
      38.              }   
      39.         }   
      40.                 
      41.         response.getWriter().append("{\"status\":1}");   
      42.         response.getWriter().flush();   
      43.         response.getWriter().close();   
      44.     
      45.     }  
      protected void doGet(HttpServletRequest request,
                  HttpServletResponse response) throws ServletException, IOException {
                
              
              String size = request.getParameter("size");
              int status;
              if(null==size||"".equals(size)){
                  status=-1;
              }
              String[] sizes = size.split("p");
              if(sizes.length%2!=0){//必须确保有宽度和高度
                 status=-2;
              }
              File file1 = new File("c://"+sizes[0]+"_"+sizes[1]+".jpg");//通过宽度和高度来命名
              ImageInputStream ii = ImageIO.createImageInputStream(request
                      .getInputStream());
       
              BufferedImage br = ImageIO.read(ii);
              try {
                  if (!file1.exists()) {
                      file1.createNewFile();
                  }
                  // 将BufferedImage变量写入文件中。
                  ImageIO.write(br, "jpg", file1);
              } catch (IOException e) {
                  e.printStackTrace();
              }
              int width=0,height=0;
              File dest = null; 
             for(int i = 2;i&lt;sizes.length;i++){
                   if(i%2==0){
                        width=Integer.parseInt(sizes[i]);
                   }else{
                        height=Integer.parseInt(sizes[i]);
                        String filename="c://"+width+"_+"height+".jpg"
                        dest = new File(filename);
                        compressPic(image,dest,width,height);
                   }
              }
                   
              response.getWriter().append("{\"status\":1}");
              response.getWriter().flush();
              response.getWriter().close();
       
          }
      
       
    • 图片压缩代码:
      Java代码 复制代码  收藏代码
      1. public String compressPic(BufferedImage img,File dest,newwidth,newheight) {      
      2.          try {      
      3.              // 判断图片格式是否正确      
      4.              if (img.getWidth(null) == -1) {     
      5.                  System.out.println(" can't read,retry!" + "   
      6. ");      
      7.                  return "no";      
      8.              } else {   
      9.                 BufferedImage tag = new BufferedImage((int) newWidth, (int) newHeight, BufferedImage.TYPE_INT_RGB);      
      10.                      
      11.                 /*   
      12.                  * Image.SCALE_SMOOTH 的缩略算法 生成缩略图片的平滑度的   
      13.                  * 优先级比速度高 生成的图片质量比较好 但速度慢   
      14.                  */      
      15.                 tag.getGraphics().drawImage(img.getScaledInstance(newWidth, newHeight, Image.SCALE_SMOOTH), 00null);     
      16.                 FileOutputStream out = new FileOutputStream(dest);     
      17.                 // JPEGImageEncoder可适用于其他图片类型的转换      
      18.                 JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);      
      19.                 encoder.encode(tag);      
      20.                 out.close();      
      21.              }      
      22.          } catch (IOException ex) {      
      23.              ex.printStackTrace();      
      24.          }      
      25.          return "ok";      
      26.     }  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值