struts2中使用kindeditor上传图片(包括jmagic压缩图片)
项目中采用的是kindeditor3.4
UploadContentImgAction
@SuppressWarnings("serial")@ParentPackage("control-center")public class UploadContentImgAction extends BaseAction {private File up;private String upFileName;private String upContentType;private String fileDir = "uploads/articleContentImg";private String imgTitle;private String align;private int imgWidth;private int imgHeight;/** * kindeditor图片上传 * @return * @throws Exception */@Action("kindeditorImgUpload")public String kindeditorImgUpload() throws Exception {//只能传图片try {if(!validatePostfix(upFileName)) {return "error";}User user = (User)getSession().get("user");String fileRealDir = getServletContext().getRealPath(fileDir);File file = up;String fileRealName = createfilename(user.getUserId());String fileName = fileRealName + upFileName.substring(upFileName.lastIndexOf(".")).toLowerCase();File newFile = new File(fileRealDir, fileName);FileUtils.copyFile(file, newFile);//压缩图片ImageUtil.resize(newFile.getPath(), newFile.getPath(), 500);String id = "contentId";String url = "/" + fileDir + "/" + fileName;String border = "0";String result = "<script type='text/javascript'>parent.KE.plugin['image'].insert('" + id + "','" + url + "','" + imgTitle + "','" + imgHeight + "','" + imgHeight + "','" + border + "','" + align + "');</script>";getHttpServletResponse().getWriter().write(result);} catch (RuntimeException e) {// TODO Auto-generated catch blocke.printStackTrace();}return null;}/** * 生成文件名 : 当前时间 + 随机数 + 用户id */private String createfilename(int userId) {StringBuilder result = new StringBuilder();// 得到 本地的 当前时间String now = DateUtil.getLongStrFromDate(new Date());// 在 1000W 内随机生成一个数字int rand = new Random().nextInt(9999999);// 去掉 - 去掉 : 去掉 空格 后,返回result.append(now.replace("-", "").replace(":", "").replace(" ", "")).append("_").append(rand).append("_").append(userId);return result.toString();}/** * 验证后缀名 应该从配置文件中获取 */public boolean validatePostfix(String filename) {// 定义可上传文件的 类型List<String> fileTypes = new ArrayList<String>();// 图片fileTypes.add("jpg");fileTypes.add("jpeg");fileTypes.add("bmp");fileTypes.add("gif");fileTypes.add("png");// 得到文件尾数 并 进行小写转换String postfix = filename.substring(filename.lastIndexOf(".") + 1).toLowerCase();return fileTypes.contains(postfix) ? true : false;}public File getUp() {return up;}public void setUp(File up) {this.up = up;}public String getUpFileName() {return upFileName;}public void setUpFileName(String upFileName) {this.upFileName = upFileName;}public String getUpContentType() {return upContentType;}public void setUpContentType(String upContentType) {this.upContentType = upContentType;}public String getImgTitle() {return imgTitle;}public void setImgTitle(String imgTitle) {this.imgTitle = imgTitle;}public int getImgWidth() {return imgWidth;}public void setImgWidth(int imgWidth) {this.imgWidth = imgWidth;}public int getImgHeight() {return imgHeight;}public void setImgHeight(int imgHeight) {this.imgHeight = imgHeight;}public String getAlign() {return align;}public void setAlign(String align) {this.align = align;}}
?
?ImageUitl
package com.yancheng.myframe.util;import java.awt.AlphaComposite;import java.awt.Color;import java.awt.Font;import java.awt.Graphics2D;import java.awt.Image;import java.awt.geom.AffineTransform;import java.awt.image.AffineTransformOp;import java.awt.image.BufferedImage;import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import javax.imageio.ImageIO;import magick.ImageInfo;import magick.MagickImage;import com.sun.image.codec.jpeg.JPEGCodec;import com.sun.image.codec.jpeg.JPEGImageEncoder;/** * @author * */public class ImageUtil {public final static int PHOTO_RATIO = 800; //缩放图片系数static{System.setProperty("jmagick.systemclassloader", "no");}/** * 图片水印 * * @param pressImg 水印图片 * @param targetImg 目标图片 * @param x 修正值 默认在中间 * @param y 修正值 默认在中间 * @param alpha 透明度 */public final static void pressImage(String pressImg, String targetImg,int x, int y, float alpha) {try {File img = new File(targetImg);Image src = ImageIO.read(img);int wideth = src.getWidth(null);int height = src.getHeight(null);BufferedImage image = new BufferedImage(wideth, height,BufferedImage.TYPE_INT_RGB);Graphics2D g = image.createGraphics();g.drawImage(src, 0, 0, wideth, height, null);// 水印文件Image src_biao = ImageIO.read(new File(pressImg));int wideth_biao = src_biao.getWidth(null);int height_biao = src_biao.getHeight(null);g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP,alpha));g.drawImage(src_biao, (wideth - wideth_biao) / 2,(height - height_biao) / 2, wideth_biao, height_biao, null);// 水印文件结束g.dispose();ImageIO.write((BufferedImage) image, "jpg", img);} catch (Exception e) {e.printStackTrace();}}/** * 文字水印 * * @param pressText 水印文字 * @param targetImg 目标图片 * @param fontName 字体名称 * @param fontStyle 字体样式 * @param color 字体颜色 * @param fontSize 字体大小 * @param x 修正值 * @param y 修正值 * @param alpha 透明度 */public static void pressText(String pressText, String targetImg, String fontName, int fontStyle, Color color, int fontSize, int x,int y, float alpha) {try {File img = new File(targetImg);Image src = ImageIO.read(img);int width = src.getWidth(null);int height = src.getHeight(null);BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);Graphics2D g = image.createGraphics();g.drawImage(src, 0, 0, width, height, null);g.setColor(color);g.setFont(new Font(fontName, fontStyle, fontSize));g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, alpha));g.drawString(pressText, (width - (getLength(pressText) * fontSize)) / 2 + x, (height - fontSize) / 2 + y);g.dispose();ImageIO.write((BufferedImage) image, "jpg", img);} catch (Exception e) {e.printStackTrace();}}/** * 缩放 效果太差 ps: Graphics下的 还有 AffineTransform下的 * 缩放都是针对"图形"而不是"图像"的,所以处理后图片很不清晰 * @param filePath 图片路径 * @param height 高度 * @param width 宽度 * @param bb 比例不对时是否需要补白 */public static void resizeImgcale(String filePath, int height, int width, boolean bb) {try {double ratio = 0.0; // 缩放比例File f = new File(filePath);BufferedImage bi = ImageIO.read(f);Image itemp = bi.getScaledInstance(width, height, bi.SCALE_SMOOTH);// 计算比例if ((bi.getHeight() > height) || (bi.getWidth() > width)) {if (bi.getHeight() > bi.getWidth()) {ratio = (new Integer(height)).doubleValue() / bi.getHeight();} else {ratio = (new Integer(width)).doubleValue() / bi.getWidth();}AffineTransformOp op = new AffineTransformOp(AffineTransform.getScaleInstance(ratio, ratio), null);itemp = op.filter(bi, null);}if (bb) {BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);Graphics2D g = image.createGraphics();g.setColor(Color.white);g.fillRect(0, 0, width, height);if (width == itemp.getWidth(null))g.drawImage(itemp, 0, (height - itemp.getHeight(null)) / 2,itemp.getWidth(null), itemp.getHeight(null),Color.white, null);elseg.drawImage(itemp, (width - itemp.getWidth(null)) / 2, 0,itemp.getWidth(null), itemp.getHeight(null),Color.white, null);g.dispose();itemp = image;}ImageIO.write((BufferedImage) itemp, "jpg", f);} catch (IOException e) {e.printStackTrace();}}/** * 计算字的长度 * * @param text * @return */public static int getLength(String text) {int length = 0;for (int i = 0; i < text.length(); i++) {if (new String(text.charAt(i) + "").getBytes().length > 1) {length += 2;} else {length += 1;}}return length / 2;}/** * 压缩图片 * * @param imgsrc 源文件 * @param imgdist 目标文件 * @param widthdist 宽 * @param heightdist 高 */public static void resizeImg(String imgsrc, String imgdist, int widthdist, int heightdist) {try {File srcfile = new File(imgsrc);if (!srcfile.exists()) {return;}Image src = javax.imageio.ImageIO.read(srcfile);BufferedImage tag = new BufferedImage(widthdist, heightdist, BufferedImage.TYPE_INT_RGB);/* * SCALE_SMOOTH:尺寸平滑 SCALE_AREA_AVERAGING:尺度区平均 SCALE_FAST:尺度快速 * SCALE_REPLICATE:尺度复制 */tag.getGraphics().drawImage(src.getScaledInstance(widthdist, heightdist, Image.SCALE_SMOOTH), 0, 0, null);FileOutputStream out = new FileOutputStream(imgdist);JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);encoder.encode(tag);out.close();} catch (IOException ex) {ex.printStackTrace();}}/** * 图片压缩 * @param picFrom * @param picTo * @param widthdist * @param heightdist */public static void resize(String picFrom, String picTo, int widthdist, int heightdist) {try {ImageInfo info = new ImageInfo(picFrom);MagickImage image = new MagickImage(new ImageInfo(picFrom));MagickImage scaled = image.scaleImage(widthdist, heightdist);// 小图片文件的大小.scaled.setFileName(picTo);scaled.writeImage(info);} catch (Exception ex) {ex.printStackTrace();}}public static void resize(String picFrom, String picTo, int ratio) throws Exception {BufferedImage bi = ImageIO.read(new File(picFrom));//原始图片属性int srcWidth = bi.getWidth();int srcHeight = bi.getHeight();//生成图片属性int newWidth = srcWidth;int newHeight = srcHeight;//如果超出最大宽或高就压缩if (srcWidth > ratio || newHeight > ratio) {//生成图片width, height计算if (srcWidth >= srcHeight) {if (srcWidth < ratio) {return;}newWidth = ratio;newHeight = (int)(ratio * srcHeight / srcWidth);} else {if (srcHeight < ratio) {return;}newHeight = ratio;newWidth = (int)(ratio * srcWidth / srcHeight);}}resize(picFrom, picTo, newWidth, newHeight);}public static void resize(String picFrom, String picTo) throws Exception {resize(picFrom, picTo, PHOTO_RATIO);}public static void main(String[] args) throws Exception {//resizeImg("d:/411766.jpg", "d:/411766_1.jpg", 800, 600);//resize("d:/test_4.jpg", "d:/test_4_2.jpg", 800);pressText("欢喜冤家", "d:/411766.jpg", "简体", Font.ITALIC, Color.black, 90, 40, 80, 0.5f);}}
??