Index: forgon-tools/src/main/java/com/forgon/tools/util/FileUtils.java =================================================================== diff -u -r15363 -r15657 --- forgon-tools/src/main/java/com/forgon/tools/util/FileUtils.java (.../FileUtils.java) (revision 15363) +++ forgon-tools/src/main/java/com/forgon/tools/util/FileUtils.java (.../FileUtils.java) (revision 15657) @@ -17,6 +17,15 @@ import java.util.ArrayList; import java.util.List; +import javax.imageio.ImageIO; + +import java.awt.Dimension; +import java.awt.Graphics2D; +import java.awt.Image; +import java.awt.Rectangle; +import java.awt.image.BufferedImage; + + import org.apache.commons.lang3.ArrayUtils; import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; @@ -73,7 +82,7 @@ } return bytes == null ? new byte[0] : bytes; } - + public static boolean saveBytesToFile(byte[] bytes, String absolutePath) { boolean saved = false; if (StringUtils.isBlank(absolutePath)) { @@ -156,4 +165,80 @@ } return false; } + /** + * 把图片旋转一个角度并保存 + * @param srcFilePath + * @param rangle + * @param saveFilePath + */ + public static void rotatePicAndSave(String srcFilePath,int rangle,String saveFilePath){ + if(StringUtils.isBlank(srcFilePath) || StringUtils.isBlank(saveFilePath)){ + return ; + } + try{ + BufferedImage src = ImageIO.read(new File(srcFilePath)); + BufferedImage des = Rotate(src, rangle); + if(des != null){ + ImageIO.write(des, "jpg", new File(saveFilePath)); + } + }catch(Exception e){ + e.printStackTrace(); + } + } + /** + * 图片旋转一个角度 + * @param src + * @param angel + * @return + */ + public static BufferedImage Rotate(Image src, int angel) { + int src_width = src.getWidth(null); + int src_height = src.getHeight(null); + // calculate the new image size + Rectangle rect_des = CalcRotatedSize(new Rectangle(new Dimension( + src_width, src_height)), angel); + + BufferedImage res = null; + res = new BufferedImage(rect_des.width, rect_des.height, + BufferedImage.TYPE_INT_RGB); + Graphics2D g2 = res.createGraphics(); + // transform + g2.translate((rect_des.width - src_width) / 2, + (rect_des.height - src_height) / 2); + g2.rotate(Math.toRadians(angel), src_width / 2, src_height / 2); + + g2.drawImage(src, null, null); + return res; + } + /** + * 计算旋转宽高 + * @param src + * @param angel + * @return + */ + public static Rectangle CalcRotatedSize(Rectangle src, int angel) { + // if angel is greater than 90 degree, we need to do some conversion + if (angel >= 90) { + if (angel / 90 % 2 == 1) { + int temp = src.height; + src.height = src.width; + src.width = temp; + } + angel = angel % 90; + } + + double r = Math.sqrt(src.height * src.height + src.width * src.width) / 2; + double len = 2 * Math.sin(Math.toRadians(angel) / 2) * r; + double angel_alpha = (Math.PI - Math.toRadians(angel)) / 2; + double angel_dalta_width = Math.atan((double) src.height / src.width); + double angel_dalta_height = Math.atan((double) src.width / src.height); + + int len_dalta_width = (int) (len * Math.cos(Math.PI - angel_alpha + - angel_dalta_width)); + int len_dalta_height = (int) (len * Math.cos(Math.PI - angel_alpha + - angel_dalta_height)); + int des_width = src.width + len_dalta_width * 2; + int des_height = src.height + len_dalta_height * 2; + return new java.awt.Rectangle(new Dimension(des_width, des_height)); + } } Index: ssts-sterile/src/main/java/com/forgon/disinfectsystem/sterilizationmanager/sterilizationrecord/action/SterilizationRecordAction.java =================================================================== diff -u -r15651 -r15657 --- ssts-sterile/src/main/java/com/forgon/disinfectsystem/sterilizationmanager/sterilizationrecord/action/SterilizationRecordAction.java (.../SterilizationRecordAction.java) (revision 15651) +++ ssts-sterile/src/main/java/com/forgon/disinfectsystem/sterilizationmanager/sterilizationrecord/action/SterilizationRecordAction.java (.../SterilizationRecordAction.java) (revision 15657) @@ -15,6 +15,7 @@ import java.util.List; import java.util.Map; import java.util.Set; +import java.util.UUID; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @@ -1121,6 +1122,8 @@ */ public void getSterilizationRecordPic() { String page = StrutsParamUtils.getPraramValue("page", "1"); + String indexStr = StrutsParamUtils.getPraramValue("rotateIndex", "0"); + int rotateIndex = Integer.valueOf(indexStr); byte[] img = null; if (StringUtils.isNumeric(page)) { List pictureList = sterilizationRecord @@ -1137,14 +1140,39 @@ String thumbnailImagePath = "\\thumbnail";// 缩略图路径 String thumbnailImageAbsolutePath = saveImagePath + thumbnailImagePath; + int rangle = 90 * rotateIndex; String filePath = thumbnailImageAbsolutePath + "\\" + picture.getThumbnailFileName(); if( FileUtils.fileExist(filePath) ){ - img = FileUtils.readFileBytes(filePath); + if(rangle == 0){ + img = FileUtils.readFileBytes(filePath); + }else{ + String rotaeFileName = filePath.replace(".jpg", "") + rotateIndex + ".jpg"; + if(!FileUtils.fileExist(rotaeFileName)){ + FileUtils.rotatePicAndSave(filePath, rangle, rotaeFileName); + } + img = FileUtils.readFileBytes(rotaeFileName); + } }else{ // 找不到缩略图,尝试找源图显示 filePath = picture.getFilePath(); if(StringUtils.isNotBlank(filePath) && FileUtils.fileExist(filePath)){ - img = FileUtils.readFileBytes(filePath); + byte[] picData = FileUtils.readFileBytes(filePath); + // 生成缩略图 + String thumbnailImageName = UUID.randomUUID().toString() + ".jpg"; + imageFileManager.SaveToThumbnail(picData, filePath, thumbnailImageName); + // 保存记录到数据库 + picture.setThumbnailFileName(thumbnailImageName); + objectDao.save(picture); + // 从缩略图中获取图片数据 + if(rangle == 0){ + img = FileUtils.readFileBytes(filePath); + }else{ + String rotaeFileName = filePath.replace(".jpg", "") + rotateIndex + ".jpg"; + if(!FileUtils.fileExist(rotaeFileName)){ + FileUtils.rotatePicAndSave(filePath, rangle, rotaeFileName); + } + img = FileUtils.readFileBytes(rotaeFileName); + } } } } Index: ssts-web/src/main/webapp/disinfectsystem/sterilizationmanager/sterilizationrecord/sterilizationRecordPic.js =================================================================== diff -u -r15596 -r15657 --- ssts-web/src/main/webapp/disinfectsystem/sterilizationmanager/sterilizationrecord/sterilizationRecordPic.js (.../sterilizationRecordPic.js) (revision 15596) +++ ssts-web/src/main/webapp/disinfectsystem/sterilizationmanager/sterilizationrecord/sterilizationRecordPic.js (.../sterilizationRecordPic.js) (revision 15657) @@ -31,7 +31,7 @@ initComponent: function(){ currentImageId = this.img_view_id; var cmp = this; - this.html='

'; + this.html='
'; /*this.tbar = [ {text:"上一张", id: this.id + '_pre_btn', handler: function(){ @@ -68,8 +68,7 @@ currentScalePercent = currentScalePercent / scale; //Ext.Toast.show(Math.round(currentScalePercent) + '%',Ext.Toast.ShortTime); }} - }); - + }); }, //放大、缩小 zoom: function(el, offset,type) { @@ -97,6 +96,30 @@ } currentImageWidth = nwidth; }, + switchHeightWidth: function(el) { + var width = el.getWidth(); + var height = el.getHeight(); + var nwidth = height; + var nheight = width; + var left = (width > nwidth) ? -((nwidth - width) / 2):((width - nwidth) / 2); + var top = (height > nheight) ? -((nheight - height) / 2):((height - nheight) / 2); + try{ + el.animate( + { + height: {to: nheight, from: height}, + width: {to: nwidth, from: width}, + left: {by:left}, + top: {by:top} + }, + null, + null, + 'backBoth', + 'motion' + ); + }catch(e){ + //alert(e.msg); + } + }, rotate: function(el,type){ try{ if(type == true){ @@ -120,8 +143,8 @@ var height = el.getHeight(); var nwidth = srcWidth; var nheight = srcHeight; - var left = (nwidth > width) ? -((nwidth - width) / 2):((width - nwidth) / 2); - var top = (nheight > height) ? -((nheight - height) / 2):((height - nheight) / 2); + var left = (width > nwidth) ? -((nwidth - width) / 2):((width - nwidth) / 2); + var top = (height > nheight) ? -((nheight - height) / 2):((height - nheight) / 2); try{ el.animate( { @@ -138,19 +161,74 @@ }catch(e){ //alert(e.msg); } - curRotateIndex = 0; - rotateEl(el,curRotateIndex); +// curRotateIndex = 0; +// rotateEl(el,curRotateIndex); } }); - var rotateEl = function(el,roteteIndex){ - var angle = roteteIndex * 90; - el.setStyle('-webkit-transform','rotate(' + angle + 'deg)'); - el.setStyle('-moz-transform','rotate(' + angle + 'deg)');  - el.setStyle('-ms-transform','rotate(' + angle + 'deg)');  - el.setStyle('-o-transform','rotate(' + angle + 'deg)');  - el.setStyle('transform','rotate(' + angle + 'deg)');  - el.setStyle('filter','progid:DXImageTransform.Microsoft.BasicImage(rotation=' + roteteIndex + ')');  + var rotateEl = function(el,rotateIndex){ +// var dom = el.dom; +// var angle = rotateIndex * 90; +// alert(el.className); + +// var css = ['css-turn-0', 'css-turn-90', 'css-turn-180', 'css-turn-270']; +// el.addClass(css[rotateIndex]); +// alert(css[rotateIndex]); +// .css-turn-90{ +// -moz-transform:matrix(0,1,-1,0,0,0); +// -o-transform:matrix(0,1,-1,0,0,0); +// -webkit-transform:matrix(0,1,-1,0,0,0); +// transform:matrix(0,1,-1,0,0,0); +// -ms-filter:"progid:DXImageTransform.Microsoft.Matrix(M11=0, M12=-1, M21=1, M22=0, SizingMethod='auto expand')" +// } +// el.setStyle('-webkit-transform','matrix(0,1,-1,0,0,0)'); +// el.setStyle('-moz-transform','matrix(0,1,-1,0,0,0)'); +// el.setStyle('-o-transform','matrix(0,1,-1,0,0,0');  +// el.setStyle('transform','matrix(0,1,-1,0,0,0)'); +// el.setStyle('-ms-filter',"progid:DXImageTransform.Microsoft.Matrix(M11=0, M12=-1, M21=1, M22=0, SizingMethod=\'auto expand\')"); +// +// el.fieldClass = css[roteteIndex]; +// fnRotateScale(dom,angle,1); +// el.setStyle('-webkit-transform','rotate(' + angle + 'deg)'); +// el.setStyle('-moz-transform','rotate(' + angle + 'deg)');  +// el.setStyle('-ms-transform','rotate(' + angle + 'deg)');  +// el.setStyle('-o-transform','rotate(' + angle + 'deg)');  +// el.setStyle('-sand-transform','rotate(' + angle + 'deg)'); +// el.setStyle('MozTransform','rotate(' + angle + 'deg)'); +// el.setStyle('WebkitTransform','rotate(' + angle + 'deg)'); +// el.setStyle('OTransform','rotate(' + angle + 'deg)'); +// dom.style.('Transform','rotate(' + angle + 'deg)'); +// cssSandpaper.setTransform(dom, 'rotate(' + angle + 'deg)'); +// cssSandpaper.setOpacity(dom, 0.3); +// cssSandpaper.setBoxShadow(dom, "10px 10px 5px #ffcccc"); +// cssSandpaper.setGradient(dom, "-sand-gradient(linear, center top, center bottom, from(#0000ff), to(#ff0000));") +// el.setStyle('filter','progid:DXImageTransform.Microsoft.BasicImage(rotation=' + rotateIndex + ')'); +// el.setStyle('-ms-filter','progid:DXImageTransform.Microsoft.BasicImage(rotation=' + rotateIndex + ')'); +// el.setStyle('-ms-filter','progid:DXImageTransform.Microsoft.Matrix(sizingMethod=\'auto expand\', M11=0.7660444431189777, M12=-0.6427876096865394, M21=0.6427876096865398, M22=0.7660444431189779)');  + } + var fnRotateScale = function(dom, angle, scale) { + //IE + var rad = angle * (Math.PI / 180); + var m11 = Math.cos(rad) * scale, m12 = -1 * Math.sin(rad) * scale, m21 = Math.sin(rad) * scale, m22 = m11; +// var filter = "progid:DXImageTransform.Microsoft.Matrix(M11="+ m11 +",M12="+ m12 +",M21="+ m21 +",M22="+ m22 +",SizingMethod='auto expand')"; +// dom.setStyle('filter',filter); + dom.style.filter = "progid:DXImageTransform.Microsoft.Matrix(M11="+ m11 +",M12="+ m12 +",M21="+ m21 +",M22="+ m22 +",SizingMethod='auto expand')"; + //Modern + dom.style.MozTransform = "rotate("+ angle +"deg) scale("+ scale +")"; + dom.style.WebkitTransform = "rotate("+ angle +"deg) scale("+ scale +")"; + dom.style.OTransform = "rotate("+ angle +"deg) scale("+ scale +")"; + dom.style.Transform = "rotate("+ angle +"deg) scale("+ scale +")"; +// dom.style.-ms-transform = "rotate("+ angle +"deg) scale("+ scale +")"; + dom.style.Transform = "rotate("+ angle +"deg) scale("+ scale +")"; +// var MozTransform = "rotate("+ angle +"deg) scale("+ scale +")"; +// dom.setStyle('mozTransform',MozTransform); +// var WebkitTransform = "rotate("+ angle +"deg) scale("+ scale +")"; +// dom.setStyle('webkitTransform',WebkitTransform); +// var OTransform = "rotate("+ angle +"deg) scale("+ scale +")"; +// dom.setStyle('oTransform',OTransform); +// var Transform = "rotate("+ angle +"deg) scale("+ scale +")"; +// dom.setStyle('transform',Transform); + }; var scrollFunc = function (e) { try{ var direct = 0; @@ -204,10 +282,11 @@ text : '共0页' }); - var url = WWWROOT + '/disinfectSystem/sterilization/sterilizationRecordAction!getSterilizationRecordPic.do?id=' + id + '&page=' + page; + var url = WWWROOT + '/disinfectSystem/sterilization/sterilizationRecordAction!getSterilizationRecordPic.do?id=' + id + '&page=' + page + '&rotateIndex=' + 0 ; var img1 = new ImgView({ src: [url] }); + var formObj = new Ext.Panel({ width:winWidth, height:winHeight, @@ -233,13 +312,35 @@ xtype : 'button', text : '顺转', handler : function(){ - Ext.get(currentImageId).parent.rotate(Ext.get(currentImageId),true); +// Ext.get(currentImageId).parent.rotate(Ext.get(currentImageId),true); + //alert(document.getElementById(currentImageId).src); +// var className = css[index++ % 4]; +// alert(document.getElementById(currentImageId).src); +// document.getElementById(currentImageId).className = className;alert(className); + curRotateIndex = (curRotateIndex + 1) % 4; + var url = WWWROOT + '/disinfectSystem/sterilization/sterilizationRecordAction!getSterilizationRecordPic.do?id=' + id + '&page=' + page + '&rotateIndex=' + curRotateIndex + '&time='+new Date(); + var imageBrowse = Ext.get(currentImageId); + var image = imageBrowse.dom; + image.src = url;// 覆盖原来的图片 + // 切换宽高 + Ext.get(currentImageId).parent.switchHeightWidth(imageBrowse); + } },{ xtype : 'button', text : '逆转', handler : function(){ - Ext.get(currentImageId).parent.rotate(Ext.get(currentImageId),false); +// Ext.get(currentImageId).parent.rotate(Ext.get(currentImageId),false); + if(curRotateIndex == 0){ + curRotateIndex = 4; + } + curRotateIndex = (curRotateIndex - 1) % 4; + var url = WWWROOT + '/disinfectSystem/sterilization/sterilizationRecordAction!getSterilizationRecordPic.do?id=' + id + '&page=' + page + '&rotateIndex=' + curRotateIndex + '&time='+new Date(); + var imageBrowse = Ext.get(currentImageId); + var image = imageBrowse.dom; + image.src = url;// 覆盖原来的图片 + // 切换宽高 + Ext.get(currentImageId).parent.switchHeightWidth(imageBrowse); } },{ xtype : 'button', @@ -257,7 +358,7 @@ element.update('共' + totalPage + '页'); // 删除后显示第一张 page = 1; - var url = WWWROOT + '/disinfectSystem/sterilization/sterilizationRecordAction!getSterilizationRecordPic.do?id=' + id + '&page=' + page + '&time='+new Date(); + var url = WWWROOT + '/disinfectSystem/sterilization/sterilizationRecordAction!getSterilizationRecordPic.do?id=' + id + '&page=' + page + '&rotateIndex=' + curRotateIndex + '&time='+new Date(); var imageBrowse = Ext.get(currentImageId); var image = imageBrowse.dom; image.src = url;// 覆盖原来的图片 @@ -278,13 +379,20 @@ return; } page = page - 1; - var url = WWWROOT + '/disinfectSystem/sterilization/sterilizationRecordAction!getSterilizationRecordPic.do?id=' + id + '&page=' + page + '&time='+new Date(); + var lastRotateIndex = curRotateIndex; + curRotateIndex = 0; var imageBrowse = Ext.get(currentImageId); + // 还原大小 + Ext.get(currentImageId).parent.restore(imageBrowse); + if(lastRotateIndex == 1 || lastRotateIndex == 3){ + // 已经旋转过图片,宽高需要互换 + Ext.get(currentImageId).parent.switchHeightWidth(imageBrowse); + } + var url = WWWROOT + '/disinfectSystem/sterilization/sterilizationRecordAction!getSterilizationRecordPic.do?id=' + id + '&page=' + page + '&rotateIndex=' + curRotateIndex + '&time='+new Date(); var image = imageBrowse.dom; image.src = url;// 覆盖原来的图片 var element = top.Ext.get(toolbarPage.el); element.update('第' + page + '页'); - Ext.get(currentImageId).parent.restore(imageBrowse); } }, toolbarPage, @@ -297,13 +405,20 @@ return; } page = page + 1; - var url = WWWROOT + '/disinfectSystem/sterilization/sterilizationRecordAction!getSterilizationRecordPic.do?id=' + id + '&page=' + page + '&time='+new Date(); + var lastRotateIndex = curRotateIndex; + curRotateIndex = 0; + // 还原大小 var imageBrowse = Ext.get(currentImageId); + if(lastRotateIndex == 1 || lastRotateIndex == 3){ + // 已经旋转过图片,宽高需要互换 + Ext.get(currentImageId).parent.switchHeightWidth(imageBrowse); + } + Ext.get(currentImageId).parent.restore(imageBrowse); + var url = WWWROOT + '/disinfectSystem/sterilization/sterilizationRecordAction!getSterilizationRecordPic.do?id=' + id + '&page=' + page + '&rotateIndex=' + curRotateIndex + '&time='+new Date(); var image = imageBrowse.dom; image.src = url;// 覆盖原来的图片 var element = top.Ext.get(toolbarPage.el); element.update('第' + page + '页'); - Ext.get(currentImageId).parent.restore(imageBrowse); } }] }]