java处理压缩图片

用到的包:

java.awt.image.BufferedImage

java.awt.Graphics2D

java.io.FileOutputStream

com.sun.image.codec.jpeg.JPEGCodec

com.sun.image.codec.jpeg.JPEGImageEncoder

java.awt.AlphaComposite

java.awt.Graphics2D

java.awt.Image

	//处理压缩图片
		int bg_width = 800; int bg_height = 600; int set_width = 700;//处理压缩成该宽度
		BufferedImage bg_src = javax.imageio.ImageIO.read(item.getInputStream());
		BufferedImage tag = null;
		
		if(bg_src != null){//上传的文件是图片的时候
		int real_width = bg_src.getWidth();//图片的真实宽度
		int real_height = bg_src.getHeight();//图片的真实高度
		if(real_width > set_width){//当图片高度超过该限制后才压缩图片
		double compute_height = (double)set_width/real_width*real_height;//等比例计算出来的图片高度
		bg_width = set_width;
		bg_height = (int)compute_height; 
		tag = new BufferedImage(bg_width, bg_height, BufferedImage.TYPE_INT_RGB);
		Graphics2D g2d = tag.createGraphics();
        g2d.drawImage(bg_src, 0, 0, bg_width, bg_height, null);
        g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP,1.0f)); //透明度设置开始  
        g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER)); //透明度设置 结束
			}else{
				System.out.println("图片宽度小于限制,不用压缩..");
				bg_src = null;
			}
		}

                        File uploadedFile = new File(savePath, newFileName);
			//处理图片的时候
			if(bg_src != null){//上传的文件是图片的时候
				FileOutputStream fos = new FileOutputStream(uploadedFile);
		        JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(fos);
		        encoder.encode(tag);
		        fos.close();
			}else{//不是图片还是执行以前的逻辑
				item.write(uploadedFile);
			}

一个处理java压缩的类:

package com.aa;
import java.awt.AlphaComposite;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;


import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGImageEncoder;

public class AA {
	
	/**
     * 
     * @param filesrc
     * @param logosrc
     * @param outsrc
     * @param x 位置
     * @param y 位置
     */
  public void composePic(String filesrc,String logosrc,String outsrc,int x,int y) {
    try {
        File bgfile = new File(filesrc);
        Image bg_src = javax.imageio.ImageIO.read(bgfile);
        
//        File logofile = new File(logosrc);
//        Image logo_src = javax.imageio.ImageIO.read(logofile);
        
        int bg_width =x; //bg_src.getWidth(null);
        int bg_height =y; //bg_src.getHeight(null);
//        int logo_width = logo_src.getWidth(null);;
//        int logo_height = logo_src.getHeight(null);

        BufferedImage tag = new BufferedImage(bg_width, bg_height, BufferedImage.TYPE_INT_RGB);
        
        Graphics2D g2d = tag.createGraphics();
        g2d.drawImage(bg_src, 0, 0, bg_width, bg_height, null);
        
        g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP,1.0f)); //透明度设置开始  
//        g2d.drawImage(logo_src,x,y,logo_width,logo_height, null);            
        g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER)); //透明度设置 结束
        
        FileOutputStream out = new FileOutputStream(outsrc);
        JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
        encoder.encode(tag);
        out.close();
    }catch (Exception e) {
        e.printStackTrace();
    }
  } 

  public static void main(String args[]) {
      Long star = System.currentTimeMillis();
      AA pic = new AA();
      
      pic.composePic("e:/aa.jpg","e:/aa.jpg","e:/out_pic.jpg",100,100);
      Long end =System.currentTimeMillis();
      System.out.print("time====:"+(end-star));
  } 


	
}

kindeditor upload_json.jsp,在我修改过的jsp源文件:(增加sftp上传、图片超过指定像素压缩代码)

<%@page import="org.apache.commons.lang.StringUtils"%>
<%@page import="com.xz.cxzy.utils.SFTPUtil"%>
<%@page import="com.jcraft.jsch.ChannelSftp"%>
<%@page import="com.sun.image.codec.jpeg.JPEGCodec"%>
<%@page import="com.sun.image.codec.jpeg.JPEGImageEncoder"%>
<%@page import="java.awt.AlphaComposite"%>
<%@page import="java.awt.Graphics2D"%>
<%@page import="java.awt.image.BufferedImage"%>
<%@page import="java.awt.Image"%>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import="java.util.*,java.io.*" %>
<%@ page import="java.text.SimpleDateFormat" %>
<%@ page import="org.apache.commons.fileupload.*" %>
<%@ page import="org.apache.commons.fileupload.disk.*" %>
<%@ page import="org.apache.commons.fileupload.servlet.*" %>
<%@ page import="org.json.simple.*" %>
<%

/**
 * KindEditor JSP
 * 
 * 本JSP程序是演示程序,建议不要直接在实际项目中使用。
 * 如果您确定直接使用本程序,使用之前请仔细确认相关安全设置。
 * 
 */

//文件保存目录路径
String savePath = pageContext.getServletContext().getRealPath("/") + "/cxzy_fckeditor/";
System.out.println(pageContext.getServletContext().getRealPath("/") );
//文件保存目录URL
String saveUrl  = request.getContextPath() + "/cxzy_fckeditor/";
//定义允许上传的文件扩展名
HashMap<String, String> extMap = new HashMap<String, String>();
extMap.put("image", "gif,jpg,jpeg,png,bmp");
extMap.put("flash", "swf,flv");
extMap.put("media", "swf,flv,mp3,wav,wma,wmv,mid,avi,mpg,asf,rm,rmvb");
extMap.put("file", "doc,docx,xls,xlsx,ppt,htm,html,txt,zip,rar,gz,bz2");

//最大文件大小
long maxSize = 200*1024*1024;

/sftp上传配置参数start
final String hostIp = "linux服务器ip";
final Integer hostPort = 22;
final  String userName = "root";
final String password = "root";
final String hostDistinctDir = "/u01/cxzyFiles/cxzy_fckeditor/";//往服务器指定目录写文件 ps:该文件夹需要先服务器上创建好
/sftp上传配置参数end

response.setContentType("text/html; charset=UTF-8");

if(!ServletFileUpload.isMultipartContent(request)){
	out.println(getError("请选择文件。"));
	return;
}
//检查目录
File uploadDir = new File(savePath);
if(!uploadDir.isDirectory()){
	uploadDir.mkdirs();//上传目录不存在则创建目录
	//out.println(getError("上传目录不存在"));
	//return;
}
//检查目录写权限
if(!uploadDir.canWrite()){
	out.println(getError(uploadDir+"上传目录没有写权限。"));
	return;
}

String dirName = request.getParameter("dir");
if (dirName == null) {
	dirName = "image";
}
if(!extMap.containsKey(dirName)){
	out.println(getError("目录名不正确。"));
	return;
}
//创建文件夹
savePath += dirName + "/";
saveUrl += dirName + "/";
File saveDirFile = new File(savePath);
if (!saveDirFile.exists()) {
	saveDirFile.mkdirs();
}
//党建和外网后台上传增加区分
String dirType = (String)request.getSession().getAttribute("dirType"); 
dirType = StringUtils.isNotBlank(dirType)?dirType:"ylj";
savePath += dirType + "/";
saveUrl += dirType + "/";
File dirTypeFile = new File(dirType);
if(!dirTypeFile.exists()) dirTypeFile.mkdirs();
//文件夹增加日期
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
String ymd = sdf.format(new Date());
savePath += ymd + "/";
saveUrl += ymd + "/";
File dirFile = new File(savePath);
if (!dirFile.exists()) {
	dirFile.mkdirs();
}

FileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(factory);
upload.setHeaderEncoding("UTF-8");
List items = upload.parseRequest(request);
Iterator itr = items.iterator();
while (itr.hasNext()) {
	FileItem item = (FileItem) itr.next();
	String fileName = item.getName();
	long fileSize = item.getSize();
	if (!item.isFormField()) {
		//检查文件大小
		if(item.getSize() > maxSize){
			out.println(getError("请上传200M以下的文件"));
			return;
		}
		
		//处理压缩图片
		int bg_width = 800; int bg_height = 600; int set_width = 700;//处理压缩成该宽度
		BufferedImage bg_src = javax.imageio.ImageIO.read(item.getInputStream());
		BufferedImage tag = null;
		
		if(bg_src != null){//上传的文件是图片的时候
		int real_width = bg_src.getWidth();//图片的真实宽度
		int real_height = bg_src.getHeight();//图片的真实高度
		if(real_width > set_width){//当图片高度超过该限制后才压缩图片
		double compute_height = (double)set_width/real_width*real_height;//等比例计算出来的图片高度
		bg_width = set_width;
		bg_height = (int)compute_height; 
		tag = new BufferedImage(bg_width, bg_height, BufferedImage.TYPE_INT_RGB);
		Graphics2D g2d = tag.createGraphics();
        g2d.drawImage(bg_src, 0, 0, bg_width, bg_height, null);
        g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP,1.0f)); //透明度设置开始  
        g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER)); //透明度设置 结束
			}else{
				System.out.println("图片宽度小于限制,不用压缩..");
				bg_src = null;
			}
		}
		
		//检查扩展名
		String fileExt = fileName.substring(fileName.lastIndexOf(".") + 1).toLowerCase();
		if(!Arrays.<String>asList(extMap.get(dirName).split(",")).contains(fileExt)){
			out.println(getError("上传文件扩展名是不允许的扩展名。\n只允许" + extMap.get(dirName) + "格式。"));
			return;
		}

		SimpleDateFormat df = new SimpleDateFormat("yyyyMMddHHmmss");
		String newFileName = df.format(new Date()) + "_" + new Random().nextInt(1000) + "." + fileExt;
		try{
			File uploadedFile = new File(savePath, newFileName);
			//处理图片的时候
			if(bg_src != null){//上传的文件是图片的时候
				FileOutputStream fos = new FileOutputStream(uploadedFile);
		        JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(fos);
		        encoder.encode(tag);
		        fos.close();
			}else{//不是图片还是执行以前的逻辑
				item.write(uploadedFile);
			}
			
			//映射参数
			final String sftpDirName = dirName;
			final File sftpUploadedFile = uploadedFile;
			final String sftpNewFileName = newFileName;
			final String sftpDirType = dirType;
			 new Thread(){
				 boolean sortDirExists = true;//文件类型目录
				 boolean dirIsExists = true;//日期目录
				 boolean typeDirExists = true;//所属项目目录区分
				public void run(){
					try{
						//sftp code start
						//通过sftp方式往服务器指定目录写文件
						ChannelSftp sftp = SFTPUtil.connect(hostIp, hostPort, userName, password);
						if(sftp != null){
							sftp.cd(hostDistinctDir);
							//项目区分
							try{
								sftp.cd(sftpDirType);
							}catch(Exception e){
								typeDirExists = false;
							}
							if(!typeDirExists){
								sftp.mkdir(sftpDirType);
								typeDirExists = true;
								sftp.cd(sftpDirType);
							}
							//文件类型区分
							try{
								sftp.cd(sftpDirName);
							}catch(Exception e){
								sortDirExists = false;
							}
							if(!sortDirExists){
								sftp.mkdir(sftpDirName);
								sortDirExists = true;
								sftp.cd(sftpDirName);
							}
							//日期目录
							SimpleDateFormat sdf2 = new SimpleDateFormat("yyyyMMdd");
							String ym = sdf2.format(new Date());
							try {
								sftp.cd(ym);
							} catch (Exception e) {
								//出现异常说明文件在服务器上不存在
								dirIsExists = false;
							}
							if(!dirIsExists) {
								sftp.mkdir(ym);
								dirIsExists = true;
							}
							//调用文件上传
							SFTPUtil.upload(hostDistinctDir+sftpDirType+"/"+sftpDirName+"/"+ym, new FileInputStream(sftpUploadedFile), sftpNewFileName, sftp);
							SFTPUtil.disconnect(sftp);
						}
						//sftp code end	
					}catch(Exception e){
						e.printStackTrace();
					}
				}
			 }.start();
			
		}catch(Exception e){
			out.println(getError("上传文件失败。"));
			return;
		}

		JSONObject obj = new JSONObject();
		obj.put("error", 0);
		obj.put("url", saveUrl + newFileName);
		out.println(obj.toJSONString());
	}
}
%>
<%!
private String getError(String message) {
	JSONObject obj = new JSONObject();
	obj.put("error", 1);
	obj.put("message", message);
	return obj.toJSONString();
}
%>


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值