问题简介
项目中要用到头像上传组件,能够剪切并生成缩略图。在网上找到一大圈,大多数都是要Money的,虽然可以免费使用,但是都是有水印。最终找到了FaustCplus,不但免费无水印,而且提供了源码,推荐有需要的人使用。
但是由于作者提供的是后台php代码来处理图片的,换成java试了很多方式来接受图片,比如通过fileupload组件,但是都不可行,主要传输协议类型不是formdata,通过chrome查看后台传输,Content-Type=octet-stream,并且实际后台只传输了一张图片——剪裁后的第一张图片。看来,只能通过java的ImageIO来处理,并且后台进行压缩了。
前台处理
我的处理方式是将pSize参数的值一起传到后台(注:uploadUrl后面只能带一个参数,并且参数中不能包括|),所以需要将pSize中间的|换成其他字符串,例如一个简单字母p,所以构成uploadUrl=uploadServlet?size=120p120p60p60p30p30p。具体代码如下:
- <object id="FaustCplus" data="FaustCplus/FaustCplus.swf" type="application/x-shockwave-flash" width="650" height="500">
- <param value="false" name="menu" />
- <param value="noScale" name="scale" />
- <param value="true" name="allowFullscreen" />
- <param value="always" name="allowScriptAccess" />
- <param value="transparent" name="wmode" />
- <param value="#FFFFFF" name="bgcolor" />
- <param value="pSize=300|300|100|100|40|40&jsfunc=uploadevent&imgUrl=test.jpg&pid=75642723&uploadSrc=true&showBrow=true&showCame=true&uploadUrl=UploadServlet?size=300p300p100p100p40p40p" name="flashvars" /></object>
<object id="FaustCplus" data="FaustCplus/FaustCplus.swf" type="application/x-shockwave-flash" width="650" height="500"> <param value="false" name="menu" /> <param value="noScale" name="scale" /> <param value="true" name="allowFullscreen" /> <param value="always" name="allowScriptAccess" /> <param value="transparent" name="wmode" /> <param value="#FFFFFF" name="bgcolor" /> <param value="pSize=300|300|100|100|40|40&jsfunc=uploadevent&imgUrl=test.jpg&pid=75642723&uploadSrc=true&showBrow=true&showCame=true&uploadUrl=UploadServlet?size=300p300p100p100p40p40p" name="flashvars" /></object>
后台处理
后台通过java的ImageIO来接收文件流,获取到第一张图片BufferedImage,然后保存第一张图片,同时根据传递的size压缩后面两张图片。具体代码如下:
- servlet获取参数并处理代码:
-
- 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<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();
- }
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<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(); }
- 图片压缩代码:
- public String compressPic(BufferedImage img,File dest,newwidth,newheight) {
- try {
- // 判断图片格式是否正确
- if (img.getWidth(null) == -1) {
- System.out.println(" can't read,retry!" + "
- ");
- return "no";
- } else {
- BufferedImage tag = new BufferedImage((int) newWidth, (int) newHeight, BufferedImage.TYPE_INT_RGB);
- /*
- * Image.SCALE_SMOOTH 的缩略算法 生成缩略图片的平滑度的
- * 优先级比速度高 生成的图片质量比较好 但速度慢
- */
- tag.getGraphics().drawImage(img.getScaledInstance(newWidth, newHeight, Image.SCALE_SMOOTH), 0, 0, null);
- FileOutputStream out = new FileOutputStream(dest);
- // JPEGImageEncoder可适用于其他图片类型的转换
- JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
- encoder.encode(tag);
- out.close();
- }
- } catch (IOException ex) {
- ex.printStackTrace();
- }
- return "ok";
- }