java实现上传图片进行切割的方法

本文实例讲述了java实现上传图片进行切割的方法。分享给大家供大家参考。具体分析如下:

为什么我要进行上传的图片进行切割呢,我这个项目的图片是部门logo,每个部门都可以选择不同的logo,但是要应对浏览器的兼容以及拉伸,我选择了把一张图片切成左、中、右和剩下的部分,因为左边和中变可能会有图案或者字所以不能拉伸,拉伸的只是右边的部分,剩下的部分自适应就可以了。所以用了javax的ImageReader来操作。最后以blob类型保存数据库中。
首先要在form表单里面写上enctype="multipart/form-data"

代码如下:

<form method="post" id="mainForm" action="${ctx }/admin/department!save.action" enctype="multipart/form-data">

下面在表单中写上上传组件

代码如下:

<tr> 
 <td style="width: 100px;"> 
     <strong>上传Logo:</strong> 
     <input type="hidden" name="suffix" id="suffix" value="${depart.departmentLogo.suffix }"/> 
 </td> 
 <td style="width: 225px;"> 
     <input type="file" name="logoFile" id="logoFile" onchange="checkFile();"/> 
 </td> 
</tr> 
<tr> 
 <td style="width: 100px;"></td> 
 <td style="width: 225px;"> 
     <span class="red">(图片格式:jpg,jpeg,bmp,gif,png;</span><br/> 
     <span class="red">推荐大小:1120×80像素)</span> 
 </td> 
</tr>

图片检查的checkFile()方法用于检查图片是否以规定格式结尾以及是否没有选择

代码如下:

function checkFile(){ 
         
        var value = $("#logoFile").val(); 
        if(!value){ 
            alert("请选择您要上传的图片!"); 
            return false; 
        }else{ 
            if(value.lastIndexOf(".jpg") != -1){ 
                $("#suffix").val("jpg"); 
                return true; 
            }else if(value.lastIndexOf(".jpeg") != -1){ 
                $("#suffix").val("jpeg"); 
                return true; 
            }else if(value.lastIndexOf(".gif") != -1){ 
                $("#suffix").val("gif"); 
                return true; 
            }else if(value.lastIndexOf(".bmp") != -1){ 
                $("#suffix").val("bmp"); 
                return true; 
            }else if(value.lastIndexOf(".png") != -1){ 
                $("#suffix").val("png"); 
                return true; 
            }else{ 
                alert("对不起,您上传文件格式有误,请选择指定格式的图片文件上传"); 
                return false; 
            } 
        } 
}

下面就是进行后台的save操作了。

代码如下:

public String save() throws Exception { 
        HttpServletRequest request = ServletActionContext.getRequest() ; 
        String departId = request.getParameter("id") ; 
        String departName = request.getParameter("name") ; 
        String companyId = request.getParameter("companyId") ; 
        //图片后缀 
        String suffix = request.getParameter("suffix"); 
        List<Menu> listMenu = new ArrayList<Menu>() ; 
        Company company = new Company() ; 
        company.setId(Long.valueOf(companyId)) ; 
        if(this.logoFile != null && departName != null && companyId != null && suffix != null){ 
            //获取解析图片的ImageReader 
            Iterator<ImageReader> imageReaders = ImageIO.getImageReadersByFormatName(suffix); 
            ImageReader imageReader = imageReaders.next(); 
            //把图片以字节流的形式传入 
            InputStream logoStream = new BufferedInputStream(new FileInputStream(this.logoFile)); 
            //转为图片输入流 
            ImageInputStream imageInputStream = ImageIO.createImageInputStream(logoStream); 
            imageReader.setInput(imageInputStream, true); 
            int imageWidth = imageReader.getWidth(0); 
            //固定高度80 
            int imageHeight = 80; 
            //设置左中右和剩下的宽度 
            int leftWidth = imageWidth / 2; 
            int middleWidth = (imageWidth - leftWidth) / 3; 
            int rightWidth = 5; 
            int retainWidth = imageWidth - leftWidth -middleWidth - 5; 
             
            ImageReadParam readParam = imageReader.getDefaultReadParam(); 
            BufferedImage bImage = null; 
            //裁剪左半部分 
            //根据宽和高获得矩形 
            Rectangle leftImageRectangle = new Rectangle(0, 0, leftWidth, imageHeight); 
            readParam.setSourceRegion(leftImageRectangle); 
            bImage = imageReader.read(0, readParam);  
            //字节数组输出流 
            ByteArrayOutputStream leftByteArrayOutputStream = new ByteArrayOutputStream(); 
            ImageIO.write(bImage, suffix, leftByteArrayOutputStream); 
            //获得字节数组 
            byte[] leftImageData = leftByteArrayOutputStream.toByteArray(); 
            leftByteArrayOutputStream.close(); 
            //Hibernate创建一个blob类型 
            Blob leftBlob = Hibernate.createBlob(leftImageData, this.departmentManager.getSession()); 
             
            //裁剪中部部分 
            Rectangle middleImageRectangle = new Rectangle(leftWidth, 0 , middleWidth, imageHeight); 
            readParam.setSourceRegion(middleImageRectangle); 
            bImage = imageReader.read(0, readParam); 
             
            ByteArrayOutputStream middleArrayOutputStream = new ByteArrayOutputStream(); 
            ImageIO.write(bImage, suffix, middleArrayOutputStream); 
            byte[] middleImageData = middleArrayOutputStream.toByteArray(); 
            middleArrayOutputStream.close(); 
            Blob middleBlob = Hibernate.createBlob(middleImageData, this.departmentManager.getSession()); 
             
            //裁剪右半部分 
            Rectangle rightImageRectangle = new Rectangle(leftWidth + middleWidth, 0, rightWidth, imageHeight); 
            readParam.setSourceRegion(rightImageRectangle); 
            bImage = imageReader.read(0, readParam); 
             
            ByteArrayOutputStream rightArrayOutputStream = new ByteArrayOutputStream(); 
            ImageIO.write(bImage, suffix, rightArrayOutputStream); 
            byte[] rightImageData = rightArrayOutputStream.toByteArray(); 
            rightArrayOutputStream.close(); 
            Blob rightBlob = Hibernate.createBlob(rightImageData, this.departmentManager.getSession()); 
             
            //保留部分 
            Rectangle retainRectangle = new Rectangle(leftWidth + middleWidth + rightWidth, 0, retainWidth, imageHeight); 
            readParam.setSourceRegion(retainRectangle); 
            bImage = imageReader.read(0, readParam); 
             
            ByteArrayOutputStream retainArrayOutputStream = new ByteArrayOutputStream(); 
            ImageIO.write(bImage, suffix, retainArrayOutputStream); 
            byte[] retainImageData = retainArrayOutputStream.toByteArray(); 
            retainArrayOutputStream.close(); 
            Blob retainBlob = Hibernate.createBlob(retainImageData, this.departmentManager.getSession()); 
             
            if(!departId.equals("") && departId!=null){ 
                Department d = this.departmentManager.findById(Long.valueOf(departId)) ; 
                if(this.checkedAuthIds != null){ 
                    for(int i=0;i<checkedAuthIds.size();i++){ 
                        Menu menu = new Menu() ; 
                        menu.setId(checkedAuthIds.get(i)) ; 
                        listMenu.add(menu) ; 
                    } 
                    d.setMenus(listMenu) ; 
                } 
                d.getDepartmentLogo().setLeftPartImage(leftBlob); 
                d.getDepartmentLogo().setMiddlePartImage(middleBlob); 
                d.getDepartmentLogo().setRightPartImage(rightBlob); 
                d.getDepartmentLogo().setRetainPartImage(retainBlob); 
                d.getDepartmentLogo().setCreateTime(new Date()); 
                d.getDepartmentLogo().setSuffix(suffix); 
                d.setName(departName) ; 
                d.setParentId(0L) ; 
                d.setNodeType(1) ; 
                d.setGrade(1) ; 
                d.setCompany(company) ; 
                this.departmentManager.save(d) ; 
            }else{ 
                Integer parentNodeType = 0 ; 
                Department dd = new Department() ; 
                if(this.checkedAuthIds!=null && this.checkedAuthIds.size() != 0){ 
                    for(int i=0;i<checkedAuthIds.size();i++){ 
                        Menu menu = new Menu() ; 
                        menu.setId(checkedAuthIds.get(i)) ; 
                        listMenu.add(menu) ; 
                    } 
                    dd.setMenus(listMenu) ; 
                }else{ 
                    dd.setMenus(null) ; 
                } 
                DepartmentLogo departmentLogo = new DepartmentLogo() ; 
                departmentLogo.setCreateTime(new Date()); 
                departmentLogo.setLeftPartImage(leftBlob); 
                departmentLogo.setMiddlePartImage(middleBlob); 
                departmentLogo.setRightPartImage(rightBlob); 
                departmentLogo.setRetainPartImage(retainBlob); 
                departmentLogo.setSuffix(suffix); 
                dd.setDepartmentLogo(departmentLogo); 
                dd.getDepartmentLogo().setDepartment(dd); 
                dd.setId(this.departmentManager.findMaxId()+1) ; 
                dd.setName(departName) ; 
                dd.setParentId(0L) ; 
                dd.setNodeType(1) ; 
                dd.setGrade(1) ; 
                dd.setOrderType(0) ; 
                dd.setCompany(company) ; 
                dd.setFlag(0) ; 
                this.departmentManager.save(dd) ; 
            } 
        } 
        return "reload"; 
}

下面就是显示了,我是用的qui,所以在top.jsp上面的css中进行动态显示

代码如下:

<style type="text/css"> 
.welcome-hide{width: 210px;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;} 
#leftLogo{background: url(${ctx }/admin/department-logo!showLogo.action?position=left) no-repeat;width: ${leftWidth}px;height: 80px;} 
#middleLogo{background: url(${ctx }/admin/department-logo!showLogo.action?position=middle) no-repeat;width: ${middleWidth}px;height: 80px;} 
#rightLogo,#topTableStyle{background: url(${ctx }/admin/department-logo!showLogo.action?position=right) repeat-x;height: 80px;} 
#retainLogo{background: url(${ctx }/admin/department-logo!showLogo.action?position=retain) no-repeat;width: ${retainWidth}px;height: 80px;} 
</style>

department-logo!showLogo.action中的showLogo方法就是加载图片的方法

代码如下:

public String showLogo() { 
         
        HttpServletRequest request = ServletActionContext.getRequest(); 
        LoginUser loginUser = (LoginUser)((SecurityContext)request.getSession(). 
                getAttribute("SPRING_SECURITY_CONTEXT")).getAuthentication().getPrincipal(); 
        List<DepartmentLogo> logos = this.logoManager.findAll(); 
        for (DepartmentLogo departmentLogo : logos) { 
            if (loginUser.getUser().getDepartment().getId().equals(departmentLogo.getDepartment().getId())) { 
                String param = request.getParameter("position"); 
                Blob blob = null; 
                if (param != null) { 
                    try { 
                        if (param.equals("left")) { 
                            blob = departmentLogo.getLeftPartImage(); 
                            imageLogo = blob.getBinaryStream(); 
                            return "showLogo"; 
                        }else if (param.equals("middle")) { 
                            blob = departmentLogo.getMiddlePartImage(); 
                            imageLogo = blob.getBinaryStream(); 
                            return "showLogo"; 
                        }else if (param.equals("right")) { 
                            blob = departmentLogo.getRightPartImage(); 
                            imageLogo = blob.getBinaryStream(); 
                            return "showLogo"; 
                        }else if (param.equals("retain")) { 
                            blob = departmentLogo.getRetainPartImage(); 
                            imageLogo = blob.getBinaryStream(); 
                            return "showLogo"; 
                        } 
                    } catch (Exception e) { 
                        e.printStackTrace(); 
                    } 
                } 
            } 
        } 
        return null; 
}

当然返回的地址应该选择struts2中的type="stream"

代码如下:

@Results({ 
    @Result(name = "showLogo", type = "stream", params = {"contentType", "image/jpeg," 
            + "image/bmp,image/png,image/gif,image/jpeg",  
            "inputName", "imageLogo", "bufferSize", "4096"}) 
})

那么top.jsp中的width是怎么得到的呢?
实在加载菜单的时候得到的,下面是menu中的方法

代码如下:

HttpServletRequest request = ServletActionContext.getRequest(); 
List<DepartmentLogo> logos = this.logoManager.findAll(); 
for (DepartmentLogo departmentLogo : logos) { 
    if (user.getDepartment().getId().equals(departmentLogo.getDepartment().getId())) { 
 request.setAttribute("leftWidth", ImageIO.read(departmentLogo. 
  getLeftPartImage().getBinaryStream()).getWidth()); 
 request.setAttribute("middleWidth", ImageIO.read(departmentLogo. 
  getMiddlePartImage().getBinaryStream()).getWidth()); 
 request.setAttribute("retainWidth", ImageIO.read(departmentLogo. 
  getRetainPartImage().getBinaryStream()).getWidth()); 
 break; 
    } 
}

这样就完成了一个上传显示功能。

这个就是我上传的测试图片。

希望本文所述对大家的Java程序设计有所帮助。

(0)

相关推荐

  • JSP上传图片产生 java.io.IOException: Stream closed异常解决方法

    在做 jsp 上传图片时,把 java 代码直接改成 jsp,上传时产生 如下异常: 2012-12-31 8:59:21 org.apache.catalina.core.StandardWrapperValve invoke 严重: Servlet.service() for servlet jsp threw exception java.io.IOException: Stream closed ... 百思不得其解,翻出 jsp 转成 servlet 后的代码.如下(很很的醒目一下):

  • jquery的ajaxSubmit()异步上传图片并保存表单数据演示代码

    (jsp需要引入 :jquery-1.9.0.js.jquery.form.js ) ,jsp页面使用的是bootstrap制作的,看不懂的标签不用管,form表单大同小异.代码比较简陋,只是为了演示使用ajaxSubmit异步上传图片及保存数据,请海含! (参考文献:http://www.jb51.net/shouce/jquery/jquery_api/Plugins/Form/ajaxSubmit.html) 一:web (add.jsp) 复制代码 代码如下: <%@page impor

  • java异步上传图片示例

    复制代码 代码如下: final File imageFile = new File(getCacheDir().getPath() + "/img/" + p.image); image.setVisibility(View.GONE); view.findViewById(R.id.imageLoading).setVisibility(View.VISIBLE); (new AsyncTask<Void, Void, Bitmap>() {     @Override

  • Java使用Ajax实现跨域上传图片功能

    说明 : 图片服务器是用Nginx搭建的,用的是PHP语言 这个功能 需要 用到两个js文件: jquery.js和jQuery.form.js <script type="text/JavaScript" src="js/jquery.js"></script> <script type="text/javascript" src="js/jquery.form.js"></scri

  • jQuery AjaxUpload 上传图片代码

    本次使用AJAXUPLOAD做为上传客户端无刷上传插件,其最新版本为3.9,官方地址:http://valums.com/ajax-upload/ 在页面中引入 jquery.min.1.4.2.js 和 ajaxupload.js <script src="Scripts/jquery-1.4.2.min.js" type="text/javascript"></script> <script src="Scripts/aj

  • swfupload ajax无刷新上传图片实例代码

    最近自己做项目的时候需要添加一个功能,上传用户的图片,上传用户图片其实涉及到很多东西,不只是一个html标签<input id="File1" type="file" />或者asp.net封住好的FileUpload 控件,现在网站不再讲究的是功能性,更多的是用户体验性,在这里上传图片就需要用到ajax无刷新上传图片,这里面包含的东西不是一点半点.这里用到的是一个插件swfupload 实现无刷新上传图片.直接上传我的代码供大家参考. 前台代码区: 复

  • java实现上传图片进行切割的方法

    本文实例讲述了java实现上传图片进行切割的方法.分享给大家供大家参考.具体分析如下: 为什么我要进行上传的图片进行切割呢,我这个项目的图片是部门logo,每个部门都可以选择不同的logo,但是要应对浏览器的兼容以及拉伸,我选择了把一张图片切成左.中.右和剩下的部分,因为左边和中变可能会有图案或者字所以不能拉伸,拉伸的只是右边的部分,剩下的部分自适应就可以了.所以用了javax的ImageReader来操作.最后以blob类型保存数据库中. 首先要在form表单里面写上enctype="mult

  • Java中上传图片压缩处理的方法示例

    整理文档,搜刮出一个Java做图片压缩的代码,稍微整理精简一下做下分享. 首先,要压缩的图片格式不能说动态图片,你可以使用bmp.png.gif等,至于压缩质量,可以通过BufferedImage来指定. 在C盘的temp下放置一张图片pic123.jpg,尽量找一个像素高一点的图片,这里我找了一张5616*3744的. package test; import java.io.*; import java.util.Date; import java.awt.*; import java.aw

  • Java实现字符串切割的方法详解

    今天给大家介绍一个小知识点,但是会非常的实用,就是平时我们写Java代码的时候,如果要对字符串进行切割,我们巧妙的运用一些技巧,可以把性能提升5~10倍.下面不说废话,直接来给大家上干货! 工作中常用的split()切割字符串效率高吗? 首先,我们用下面的一段代码,去拼接出来一个用逗号分隔的超长字符串,把从0开始一直到9999的每个数字都用逗号分隔,拼接成一个超长的字符串,以便于我们可以进行实验,代码如下所示: public class StringSplitTest { public stat

  • Java中String的split切割字符串方法实例及扩展

    目录 一.public String[] split(String regex) 二.public String[] split(String regex, int limit) 三.扩展 总结 一.public String[] split(String regex) public String[] split(String regex): 根据传入的字符串参数,作为规则,切割当前字符串 String a="198,168,10,1"; String [] arr=a.split(&

  • PHP使用finfo_file()函数检测上传图片类型的实现方法

    本文实例讲述了PHP使用finfo_file()函数检测上传图片类型的实现方法.分享给大家供大家参考,具体如下: 在输入输出中,文件的交互必不可少,比如文件的上传什么的.这里我们来解决一个小问题,就是如何判断用户上传文件的文件类型. 举一个应用场面:在我们的Web应用中,比如用户上传头像,要求是png,jpg,gif格式,接收到图片后会根据图片格式类型做不同的头像切割处理,但个别用户会传一些只更改过文件后缀的非标准图片,比如nowamagic.jpg 强行修改成 nowamagic.png,这样

  • Android使用post方式上传图片到服务器的方法

    本文实例讲述了Android使用post方式上传图片到服务器的方法.分享给大家供大家参考,具体如下: /** * 上传文件到服务器类 * * @author tom */ public class UploadUtil { private static final String TAG = "uploadFile"; private static final int TIME_OUT = 10 * 1000; // 超时时间 private static final String CH

  • Java判断上传图片格式的实例代码

    先给大家介绍下java判断上传图片格式. 由于客户上传图片将png的图片的后缀名改为jpg,所以通过后缀名判断不行,用下面这个方法可以 //判断是否是JPG格式 log.info("-1----进入JPG格式判断....."); ImageInputStream iis = ImageIO.createImageInputStream(file.getInputStream()); Iterator<ImageReader> iter = ImageIO.getImageR

  • java字符串反转的7种方法

    目录 1.用stringBuffer或者stringBuilder自带的reverse方法 2.将字符串拆分为char数组 3.stringBuffer倒序拼接 4.利用栈的先进后出 5.二分换位反转 6.切割递归反转 7.二分递归反转 1.用stringBuffer或者stringBuilder自带的reverse方法     public static String reverseTestOne(String s) {         return new StringBuffer(s).r

  • java编程创建型设计模式工厂方法模式示例详解

    目录 1.什么是工厂方法模式? 2.案例实现 3.JDK中的工厂方法模式 1.什么是工厂方法模式? 工厂方法模式设计方案:  将披萨项目的实例化功能抽象成抽象方法,在不同的口味点餐子类中具体实现. 工厂方法模式:  定义了一个创建对象的抽象方法,由子类决定要实例化的类.工厂方法模式将对象的实例化推迟到子类. 何时使用?  不同条件下创建不用实例时.方法是让子类实现工厂接口. 2.案例实现 假如说,我们现在有这样一个需求:客户在点披萨时,可以点不同口味的披萨,比如北京的奶酪pizza.北京的胡椒p

  • java实现上传图片尺寸修改和质量压缩

    本文实例为大家分享了java实现上传图片尺寸修改和质量压缩的具体代码,供大家参考,具体内容如下 package com.zity.frame.util;   /**    *  缩略图实现,将图片(jpg.bmp.png.gif等等)真实的变成想要的大小    */   import com.sun.image.codec.jpeg.JPEGCodec; import com.sun.image.codec.jpeg.JPEGImageEncoder; import net.sourceforg

随机推荐