java关于图片处理修改图片大小
最近做了一个关于图片浏览的内容。因为图片都是一些证件的资料的扫描件所以比较大,对系统的影响也是非常之大的,有很大可能直接把系统干死。那么我是这么处理的,给大家分享一下。如果大家有好的方案的话一定要早点告诉我。
需求简单介绍:
上传文件是压缩包,但是到查看资料的时候压缩包可下载本地看,同时也可以在系统中直接在线浏览。
设计方案
1 营业部用户上传图片文件压缩包文件到综合业务系统tomcat服务器,系统在tomcat服务器将压缩文件解压到系统临时目录。
2 系统分析解压的图片文件(文件名上有分类和序号),按照分类和顺序将文件名存入到数据库表中。存入数据库的文件名带有路径。
3 将解压的文件和压缩包按照规定的路径上传到FTP服务器中。
4 FTP服务器同时是一台tomcat服务器,图片的目录在tomcat服务器的webapps目录下。
5 图片的路径命名方式:
webapps/imageserver/年(如2014)/月(如05)/日(如19)/16位唯一随机码/压缩包和解压文件
6 信审部查看图片文件和下载压缩包时,直接通过URL访问。
7 文件服务器不另外设置权限访问控制,所有访问控制通过16位唯一随机码控制,只有知道了16位唯一随机码,才能访问到图片文件和压缩包。
8 为了保证访问速度,单个图片文件最好控制在1M一下(我们可以推荐用户使用较低分辨率的扫描文件)。
9 如果图片访问量较大,需要购买硬件来升级文件服务器,例如采用NAS存储,升级带宽等。
实现步骤:
1:上传压缩包:解压到本地临时目录,检测图片大小修改图片大小,上传到ftp。
2:读取对应的的数据进行浏览。
这些相信大家都会,我下面贴出一个修改图片大小的工具类,方便我自己记忆,如果对大家有帮助也可以参考。
这个图片处理机制效率实在太慢,6个图片4-5秒,查了很多试了很多也没找到合适方法,暂且就用这个吧。如果有好的方法还望大家多多指教。
package com.minxinloan.black.web.utils; import java.awt.Graphics;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException; import javax.imageio.ImageIO; import org.apache.log4j.Logger;
//
import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGImageEncoder;
//
//import com.sun.media.jai.codecimpl.JPEGCodec;
//import com.sun.media.jai.codecimpl.JPEGImageEncoder; public class ImagesUtils { private final static Logger log = Logger.getLogger(ImagesUtils.class);
//图片允许的最大大小
public static final int IMAGEMAXSIZE = 1024*1024;
// 图片宽和高的最大尺寸
public static final int IMAGEMAXBIG = 2000;
// 图片宽和高的最小尺寸
public static final int IMAGEMINBIG = 10;
// 按原图大小生成新图
public static final int CREATENEWIMAGETYPE_0 = 0;
// 按指定的大小生成新图
public static final int CREATENEWIMAGETYPE_1 = 1;
// 按原图宽高比例生成新图-按指定的宽度
public static final int CREATENEWIMAGETYPE_2 = 2;
// 按原图宽高比例生成新图-按指定的高度
public static final int CREATENEWIMAGETYPE_3 = 3;
// 按原图宽高比例生成新图-按指定的宽和高中较大的尺寸
public static final int CREATENEWIMAGETYPE_4 = 4;
// 按原图宽高比例生成新图-按指定的宽和高中较小的尺寸
public static final int CREATENEWIMAGETYPE_5 = 5;
// 按原图宽高比例生成新图-按原图大小的90%进行修改
public static final int CREATENEWIMAGETYPE_6 = 6; /**
*
* @param _file
* 原图片
* @param createType
* 处理类型
* @param newW
* 新宽度
* @param newH
* 新高度
* @return
* @throws Exception
*/
public static String createNewImage(File _file, int createType, int newW,
int newH) throws Exception {
if (_file == null)
return null;
String fileName = _file.getPath();
if (fileName == null || "".equals(fileName)
|| fileName.lastIndexOf(".") == -1)
return null;
/*
* else newFileName = "_" + newFileName;
*/ String outFileName = fileName.substring(0, fileName.lastIndexOf("."))
+ fileName.substring(fileName.lastIndexOf("."), fileName
.length());
String fileExtName = fileName.substring(
(fileName.lastIndexOf(".") + 1), fileName.length());
if (newW < IMAGEMINBIG)
newW = IMAGEMINBIG;
else if (newW > IMAGEMAXBIG)
newW = IMAGEMAXBIG; if (newH < IMAGEMINBIG)
newH = IMAGEMINBIG;
else if (newH > IMAGEMAXBIG)
newH = IMAGEMAXBIG; // 得到原图信息
if (!_file.exists() || !_file.isAbsolute() || !_file.isFile()
|| !checkImageFile(fileExtName))
return null;
Image src = ImageIO.read(_file);
int w = src.getWidth(null);
int h = src.getHeight(null); // 确定目标图片的大小
int nw = w;
int nh = h;
if (createType == CREATENEWIMAGETYPE_0)
;
else if (createType == CREATENEWIMAGETYPE_1) {
nw = newW;
nh = newH;
} else if (createType == CREATENEWIMAGETYPE_2) {
nw = newW;
nh = (int) ((double) h / (double) w * nw);
} else if (createType == CREATENEWIMAGETYPE_3) {
nh = newH;
nw = (int) ((double) w / (double) h * nh);
} else if (createType == CREATENEWIMAGETYPE_4) {
if ((double) w / (double) h >= (double) newW / (double) newH) {
nh = newH;
nw = (int) ((double) w / (double) h * nh);
} else {
nw = newW;
nh = (int) ((double) h / (double) w * nw);
}
} else if (createType == CREATENEWIMAGETYPE_5) {
if ((double) w / (double) h <= (double) newW / (double) newH) {
nh = newH;
nw = (int) ((double) w / (double) h * nh);
} else {
nw = newW;
nh = (int) ((double) h / (double) w * nw);
}
} else if(createType == CREATENEWIMAGETYPE_6){
// nw = (int)(w*0.5);
// nh = (int)(h*0.5);
double proportion = (double)1700/(double)w;
nw = (int)((double)w*proportion);
nh = (int)((double)h*proportion);
} // 构造目标图片
BufferedImage tag = new BufferedImage(nw, nh,
BufferedImage.TYPE_INT_RGB); // 得到目标图片输出流
FileOutputStream out = new FileOutputStream(outFileName); // 根据需求画出目标图片 方式1
tag.getGraphics().drawImage(src, 0, 0, nw, nh, null); // 将画好的目标图输出到输出流 方式1
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
encoder.encode(tag);
out.close();
return outFileName;
} public static boolean checkImageFile(String extName) { if ("jpg".equalsIgnoreCase(extName))
return true;
if ("gif".equalsIgnoreCase(extName))
return true;
if ("bmp".equalsIgnoreCase(extName))
return true;
if ("jpeg".equalsIgnoreCase(extName))
return true;
if ("png".equalsIgnoreCase(extName))
return true;
return false;
}
public static String checkImageFile2(String extName) { if ("jpg".equalsIgnoreCase(extName))
return "jpg";
if ("gif".equalsIgnoreCase(extName))
return "gif";
if ("bmp".equalsIgnoreCase(extName))
return "bmp";
if ("jpeg".equalsIgnoreCase(extName))
return "jpeg";
if ("png".equalsIgnoreCase(extName))
return "jpeg";
return null;
} //递归修改图片大小
public static void changeImgSize(String filePath,int createType)
{
try {
File tempFile = new File(filePath);
if(tempFile.length()>IMAGEMAXSIZE){
System.out.println("sss");
changeImgSize(createNewImage(tempFile, createType, 0, 0),createType);
}
} catch (Exception e) {
log.error("the changeImgSize is failed . the message is "+e.getMessage());
}
}
/**
* 缩放图像(按比例缩放)
* @param srcImageFile 源图像文件地址
* @param result 缩放后的图像地址
* @param scale 缩放比例
* @param flag 缩放选择:true 放大; false 缩小;
*/
public final static void scale(String srcImageFile,String type, String result) {
try { File tempFile = new File(srcImageFile);
if(tempFile.length()>IMAGEMAXSIZE){
System.out.println("sss");
BufferedImage src = ImageIO.read(tempFile); // 读入文件
int width = src.getWidth(); // 得到源图宽
int height = src.getHeight(); // 得到源图长 double sc = (double)1700/(double)width; width = (int)((double)width * sc);
height = (int)((double)height * sc); Image image = src.getScaledInstance(width, height,
Image.SCALE_DEFAULT);
BufferedImage tag = new BufferedImage(width, height,
BufferedImage.TYPE_INT_RGB);
Graphics g = tag.getGraphics();
g.drawImage(image, 0, 0, null); // 绘制缩小后的图
g.dispose();
ImageIO.write(tag, type, new File(result));// 输出到文件流
}
} catch (IOException e) {
e.printStackTrace();
}
} public static void changeImgSize(File file)
{
try {
// 判断文件是否是文件,如果是文件,获取路径,并计数
if (file.isFile()) {
String fileExtName = file.getName().substring(
(file.getName().lastIndexOf(".") + 1), file.getName().length()); String temp = ImagesUtils.checkImageFile2(fileExtName);
if(temp!=null)
//scale(file.getAbsolutePath(),temp,file.getAbsolutePath());
ImagesUtils.changeImgSize(file.getAbsolutePath(), ImagesUtils.CREATENEWIMAGETYPE_6);
} else {
// 如果是文件夹,声明一个数组放文件夹和他的子文件
File[] f = file.listFiles();
// 遍历文件件下的文件,并获取路径
for (File file2 : f) {
changeImgSize(file2);
}
}
} catch (RuntimeException e) {
e.printStackTrace();
}
} public static void main(String[] args) { //
// long start=System.currentTimeMillis();
// String filePath = "C:\\Users\\zhangmi\\Desktop\\资料";
// changeImgSize(new File(filePath));
//
// long end=System.currentTimeMillis();
// //在最好的一行加上:
// System.out.println("执行耗时 : "+(end-start)/1000f+" 秒 "); }
}
做已铭记
java关于图片处理修改图片大小的更多相关文章
- 27.openpyxl 向指定单元格添加图片并修改图片大小 以及修改单元格行高列宽
openpyxl 向指定单元格添加图片并修改图片大小 以及修改单元格行高列宽 from openpyxl import Workbook,load_workbook from openpyxl.dra ...
- kindeditor扩展粘贴图片功能&修改图片上传路径并通过webapi上传图片到图片服务器
前言 kindeditor是一个非常好用的富文本编辑器,它的简单使用我就不再介绍了. 而kindeditor却对图片的处理不够理想. 本篇博文需要解决的问题有两个: kindeditor扩展粘贴图片功 ...
- QPixmap显示图片 并 修改图片
http://hi.baidu.com/eygaqurchnbhsyq/item/2b9624006120f2edff240d42 QPixmap显示图片 现在我们来实现在窗口上显示图片,并学习怎样将 ...
- Wordpress编辑器(Tinymce)在Chrome中动态修改图片大小
Chrome不支持tinymce中图片动态修改大小,可以在theme的functions.php中加入下面代码在Tinymce中模拟这一功能: function tinymce_editor_sett ...
- python 批量修改图片大小
一个文件夹下面有好多图片格式是jpg大小是1920*1080,把它们处理成1280*720并按原先图片的名保存在另一路径下这里首先要找到给定路径下所有的图片文件,然后在修改图片文件的大小,这里用到PI ...
- [Ting's笔记Day9]活用套件Carrierwave gem:(4)使用Imagemagick修改图片大小
前情提要: 这几天我都在实验Carrierwave这套图片上传套件,也顺利部署到Heroku架站正式环境了.:) 接下来我遇到了新的问题:要如何在上传的时候,让Carrierwave gem大型siz ...
- word 2013 题注、图注、插入图片自动修改大小、批量更新题注编号
1 .题注 图片下面的文字说明,如 图 1.1.1 2.图注 图的标题格式,可以右键修改段落为居中,选中图片,点下此格式快捷居中等其他格式 3. 题注插入 效果 如下 4.题注自动居中对齐 先点击图 ...
- word中批量修改图片大小的两个方法
前言: 对于把ppt的内容拷贝到word中: 对ppt的一页进行复制,然后粘贴到word中 如果要的是ppt运行过程中的内容,在qq运行的情况下,按Ctrl+Alt+A截屏,按勾,然后可以直接粘贴到w ...
- asp.net上传图片文件自动修改图片大小代码
#region 图片缩放 /// <summary> /// 图片缩放 /// </summary> /// <param name="savePath&quo ...
随机推荐
- 我用Python爬虫挣钱的那些事
在下写了10年Python,期间写了各种奇葩爬虫,挣各种奇葩的钱,写这篇文章总结下几种爬虫挣钱的方式. 1.最典型的就是找爬虫外包活儿. 这个真是体力活,最早是在国外各个freelancer网站上找适 ...
- java代码求阶乘n!
面试过程中总是遇到要求写一段Java代码求阶乘.下面就是就是两种求阶乘 n! 的方法: 1.使用递归求解n! public int doFactorial(int n){ if(n<0){ re ...
- FFMpeg笔记(六) 滤镜命名规则及使用libavfilter对视频尺寸进行裁切
在ffmpeg框架中,滤镜(filter)功能通过libavfilter库实现. 一个filter可以同时有多个输入和输出.以图为例: 图中的一系列操作共使用了四个filter,分别是 spli ...
- PAT甲题题解-1095. Cars on Campus(30)-(map+树状数组,或者模拟)
题意:给出n个车辆进出校园的记录,以及k个时间点,让你回答每个时间点校园内的车辆数,最后输出在校园内停留的总时间最长的车牌号和停留时间,如果不止一个,车牌号按字典序输出. 几个注意点: 1.如果一个车 ...
- PAT甲题题解1099. Build A Binary Search Tree (30)-二叉树遍历
题目就是给出一棵二叉搜索树,已知根节点为0,并且给出一个序列要插入到这课二叉树中,求这棵二叉树层次遍历后的序列. 用结构体建立节点,val表示该节点存储的值,left指向左孩子,right指向右孩子. ...
- Daily Scrum NO.8
工作概况 今天是周六,虽然由于工作紧张要求这一日也定为工作日,但是也许是因为昨日大家工作做得较多或者周末的缘故,今天的进展状况并不理想.线程池和异常清理器的后端已经完成,而清理器的界面和动态爬取仍旧没 ...
- 使用SSH过程中遇到的几个问题及解决方案
一.HTTP Status 500 - org.springframework.orm.hibernate3.HibernateOptimisticLockingFailureException: B ...
- SCRUM站立会议模拟
项目名称:连连看游戏 小组名称:计信F4 开会时间 :2016年10月11日 20:20~20:40 组长:张政 成员:张金生,武志远,李权 会议流程: 四个人模拟了一次的小组站立会议. 小组成员和组 ...
- Jmeter使用笔记之意料之外的
以下是在测试过程中按照以前loadrunner的思维来做的一点区别: 一.组织方式之setup 在用loadrunner做接口测试的时候如果不是针对login的测试,那么一般也会把login接口放到i ...
- 继承Tcalendar控件,让当天日期醒目显示
一.新建一控件 打开Delphi主菜单Cpmponent—New Cpmponent: 二.配置参数 点击OK键,打开Unit单元文件. 三.修改单元文件 unit LyCalendar; inter ...