java實現(xiàn)上傳圖片進行切割的方法
本文實例講述了java實現(xiàn)上傳圖片進行切割的方法。分享給大家供大家參考。具體分析如下:
為什么我要進行上傳的圖片進行切割呢,我這個項目的圖片是部門logo,每個部門都可以選擇不同的logo,但是要應(yīng)對瀏覽器的兼容以及拉伸,我選擇了把一張圖片切成左、中、右和剩下的部分,因為左邊和中變可能會有圖案或者字所以不能拉伸,拉伸的只是右邊的部分,剩下的部分自適應(yīng)就可以了。所以用了javax的ImageReader來操作。最后以blob類型保存數(shù)據(jù)庫中。
首先要在form表單里面寫上enctype="multipart/form-data"
下面在表單中寫上上傳組件
<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">推薦大?。?120×80像素)</span>
</td>
</tr>
圖片檢查的checkFile()方法用于檢查圖片是否以規(guī)定格式結(jié)尾以及是否沒有選擇
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操作了。
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();
//把圖片以字節(jié)流的形式傳入
InputStream logoStream = new BufferedInputStream(new FileInputStream(this.logoFile));
//轉(zhuǎn)為圖片輸入流
ImageInputStream imageInputStream = ImageIO.createImageInputStream(logoStream);
imageReader.setInput(imageInputStream, true);
int imageWidth = imageReader.getWidth(0);
//固定高度80
int imageHeight = 80;
//設(shè)置左中右和剩下的寬度
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;
//裁剪左半部分
//根據(jù)寬和高獲得矩形
Rectangle leftImageRectangle = new Rectangle(0, 0, leftWidth, imageHeight);
readParam.setSourceRegion(leftImageRectangle);
bImage = imageReader.read(0, readParam);
//字節(jié)數(shù)組輸出流
ByteArrayOutputStream leftByteArrayOutputStream = new ByteArrayOutputStream();
ImageIO.write(bImage, suffix, leftByteArrayOutputStream);
//獲得字節(jié)數(shù)組
byte[] leftImageData = leftByteArrayOutputStream.toByteArray();
leftByteArrayOutputStream.close();
//Hibernate創(chuàng)建一個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中進行動態(tài)顯示
.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方法就是加載圖片的方法
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;
}
當然返回的地址應(yīng)該選擇struts2中的type="stream"
@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中的方法
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程序設(shè)計有所幫助。
相關(guān)文章
Java實現(xiàn)Dbhelper支持大數(shù)據(jù)增刪改
這篇文章主要介紹了Java實現(xiàn)Dbhelper支持大數(shù)據(jù)增刪改功能的實現(xiàn)過程,感興趣的小伙伴們可以參考一下2016-01-01Springboot多數(shù)據(jù)源配置之整合dynamic-datasource方式
這篇文章主要介紹了Springboot多數(shù)據(jù)源配置之整合dynamic-datasource方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-03-03IntelliJ IDEA 報錯:找不到包或者找不到符號的問題及解決方案
這篇文章主要介紹了IntelliJ IDEA 報錯:找不到包或者找不到符號的問題及解決方案,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-08-08圖解Java經(jīng)典算法希爾排序的原理與實現(xiàn)
希爾排序是希爾(Donald Shell)于1959年提出的一種排序算法。希爾排序也是一種插入排序,它是簡單插入排序經(jīng)過改進之后的一個更高效的版本,也稱為縮小增量排序,同時該算法是沖破O(n2)的第一批算法之一。本文會以圖解的方式詳細介紹希爾排序的基本思想及其代碼實現(xiàn)2022-09-09Java HttpURLConnection超時和IO異常處理
這篇文章主要介紹了Java HttpURLConnection超時和IO異常處理的相關(guān)資料,需要的朋友可以參考下2016-09-09詳解Spring Security 中的四種權(quán)限控制方式
這篇文章主要介紹了詳解Spring Security 中的四種權(quán)限控制方式,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10java執(zhí)行SQL語句實現(xiàn)查詢的通用方法詳解
這篇文章主要介紹了java執(zhí)行SQL語句實現(xiàn)查詢的通用方法詳解,具有一定借鑒價值,需要的朋友可以參考下。2017-12-12