java改变图片文件尺寸
方式一:缩放图片(缺点:如果需要固定尺寸图片,那么会使得原图变形)
1.单个图片尺寸处理:
package test.common; import java.awt.Graphics;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream; import javax.imageio.ImageIO; public class ImgTest {
private Image img;
private final static int WIDTH = 147;
private final static int HEIGHT = 136; /**
* 改变图片的大小到宽为size,然后高随着宽等比例变化
* @param is 上传的图片的输入流
* @param os 改变了图片的大小后,把图片的流输出到目标OutputStream
* @param size 新图片的宽
* @param format 新图片的格式
* @throws IOException
*/
public static OutputStream resizeImage(InputStream is, OutputStream os, int size, String format) throws IOException {
BufferedImage prevImage = ImageIO.read(is);
double width = prevImage.getWidth();
double height = prevImage.getHeight();
double percent = size/width;
int newWidth = (int)(width * percent);
int newHeight = (int)(height * percent);
BufferedImage image = new BufferedImage(newWidth, newHeight, BufferedImage.TYPE_INT_BGR);
Graphics graphics = image.createGraphics();
graphics.drawImage(prevImage, 0, 0, newWidth, newHeight, null);
ImageIO.write(image, format, os);
os.flush();
is.close();
os.close();
ByteArrayOutputStream b = (ByteArrayOutputStream) os;
return os;
} public static void main(String[] args) {
try {
InputStream is = new FileInputStream(new File("download/qrcode_test.jpg"));
OutputStream os = new FileOutputStream(new File("download/qrcode_test_1.jpg"));
resizeImage(is, os, 10, "png");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} }
2.批量图片尺寸处理:
package com.test;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.LinkedHashMap; import javax.imageio.ImageIO;
public class ImgChange {
private Image img;
private final static int WIDTH = 147;
private final static int HEIGHT = 136; /**
* 改变图片的大小到宽为size,然后高随着宽等比例变化
* @param is 上传的图片的输入流
* @param os 改变了图片的大小后,把图片的流输出到目标OutputStream
* @param size 新图片的宽
* @param format 新图片的格式
* @throws IOException
*/
public static OutputStream resizeImage(InputStream is, OutputStream os, int size, String format) throws IOException {
BufferedImage prevImage = ImageIO.read(is);
double width = prevImage.getWidth();
double height = prevImage.getHeight();
int newWidth = 600;
int newHeight = 800;
BufferedImage image = new BufferedImage(newWidth, newHeight, BufferedImage.TYPE_INT_BGR);
Graphics graphics = image.createGraphics();
graphics.drawImage(prevImage, 0, 0, newWidth, newHeight, null);
ImageIO.write(image, format, os);
os.flush();
is.close();
os.close();
//ByteArrayOutputStream b = (ByteArrayOutputStream) os;
return os;
} /**
* 读取某个目录下所有文件、文件夹
* @param path
* @return LinkedHashMap<String,String>
*/
public static LinkedHashMap<String,String> getFiles(String path) {
LinkedHashMap<String,String> files = new LinkedHashMap<String,String>();
File file = new File(path);
File[] tempList = file.listFiles(); for (int i = 0; i < tempList.length; i++) {
if (!tempList[i].isDirectory()) {
files.put(tempList[i].getName(),tempList[i].getPath());
}
}
return files;
} public static void main(String[] args) {
try {
LinkedHashMap<String,String> files = getFiles("D:/img");
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
Date beginDate = new Date();
System.out.println("开始:"+sdf.format(beginDate));
for (String fileName : files.keySet()) {
InputStream is = new FileInputStream(new File(files.get(fileName)));
OutputStream os = new FileOutputStream(new File("D:/imgCopy/"+fileName));
resizeImage(is, os, 10, "jpg");
}
Date endDate = new Date();
System.out.println("结束:"+sdf.format(endDate));
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
方式二:裁剪图片(缺点:可能会使得图片展示不完全,只能取到图片中间部分的内容)
package com.test; import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.text.SimpleDateFormat;
import java.util.Date; import javax.imageio.ImageIO; public class ImgCrop { /**
* 改变图片的大小到宽为size,然后高随着宽等比例变化
* @param is 上传的图片的输入流
* @param os 改变了图片的大小后,把图片的流输出到目标OutputStream
* @param size 新图片的宽
* @param format 新图片的格式
* @throws IOException
*/
public static OutputStream resizeImage(BufferedImage bufferedimage,int widht,int height,OutputStream os, String format) throws IOException {
BufferedImage image = new BufferedImage(widht, height, BufferedImage.TYPE_INT_BGR);
Graphics graphics = image.createGraphics();
graphics.drawImage(bufferedimage, 0, 0, widht, height, null);
ImageIO.write(image, format, os);
os.flush();
os.close();
return os;
} /**
* * 裁剪图片方法 *
* @param bufferedImage 图像源 *
* @param startX 裁剪开始x坐标 *
* @param startY 裁剪开始y坐标 *
* @param endX 裁剪结束x坐标 *
* @param endY 裁剪结束y坐标 *
* @return
*/
public static BufferedImage cropImage(BufferedImage Image, int startX, int startY, int endX, int endY) {
int width = Image.getWidth();
int height = Image.getHeight();
if (startX == -1) {
startX = 0;
}
if (startY == -1) {
startY = 0;
}
if (endX == -1) {
endX = width - 1;
}
if (endY == -1) {
endY = height - 1;
}
BufferedImage result = new BufferedImage(endX - startX, endY - startY, 4);
for (int x = startX; x < endX; ++x) {
for (int y = startY; y < endY; ++y) {
int rgb = Image.getRGB(x, y);
result.setRGB(x - startX, y - startY, rgb);
}
}
return result;
} public static void main(String[] args) throws IOException {
//原始图片路径
String imagePath = "D:/image";
File imageFile = new File(imagePath);
File[] imageFiles = imageFile.listFiles();
for (File fimage : imageFiles) {
BufferedImage bufferedimage=ImageIO.read(fimage);
int width = bufferedimage.getWidth();
int height = bufferedimage.getHeight(); OutputStream os = new FileOutputStream(new File("D:/img/"+fimage.getName()));
resizeImage(bufferedimage,width,height,os,"jpg");
os.flush();
os.close();
} //过程图片路径
String path = "D:/img";
dealImg(path); String cachePath = "D:/imgCache";
File file = new File(cachePath);
File[] files = file.listFiles();
while(files.length>0) {
dealImg(cachePath);
file = new File(path);
files = file.listFiles();
}
} /**
* 处理图片
* @param path 文件夹路径
*/
private static void dealImg(String path) {
try {
File file = new File(path);
File[] files = file.listFiles();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
Date beginDate = new Date();
System.out.println(path+"begin:"+sdf.format(beginDate));
for (File f : files) {
BufferedImage bufferedimage=ImageIO.read(f);
Double width = (double) bufferedimage.getWidth();
Double height = (double) bufferedimage.getHeight();
if (width<900||height<1200) {
while (width<900||height<1200) {
width=width*1.1;
height=height*1.1;
}
OutputStream os = new FileOutputStream(new File("D:/imgCache/"+f.getName()));
resizeImage(bufferedimage,width.intValue(),height.intValue(),os,"jpg");
f.delete();
os.flush();
os.close();
continue;
}
//目标将图片裁剪成 宽900,高1200
if (width > 900) {
/*开始x坐标 开始y坐标 结束x坐标 结束y坐标*/
bufferedimage=cropImage(bufferedimage,(int) ((width - 900) / 2),0,(int) (width - (width-900) / 2),height.intValue());
if (height > 1200) {
bufferedimage=cropImage(bufferedimage,0,(int) ((height - 1200) / 2),900,(int) (height - (height - 1200) / 2) );
}
}else{
if (height > 1200) {
bufferedimage=cropImage(bufferedimage,0,(int) ((height - 1200) / 2),width.intValue(),(int) (height - (height - 1200) / 2) );
}
}
OutputStream os = new FileOutputStream(new File("D:/imgCopy/"+f.getName()));
ImageIO.write(bufferedimage, "jpg", os); //输出裁剪图片
f.delete();
os.flush();
os.close();
}
Date endDate = new Date();
System.out.println(path+"end:"+sdf.format(endDate));
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
裁剪图片优化版:
package com.jeecg.util; import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.text.SimpleDateFormat;
import java.util.Date; import javax.imageio.ImageIO; public class ImgCrop { /**
* 改变图片的大小到宽为size,然后高随着宽等比例变化
* @param is 上传的图片的输入流
* @param os 改变了图片的大小后,把图片的流输出到目标OutputStream
* @param size 新图片的宽
* @param format 新图片的格式
* @throws IOException
*/
public static OutputStream resizeImage(BufferedImage bufferedimage,int widht,int height,OutputStream os, String format) throws IOException {
BufferedImage image = new BufferedImage(widht, height, BufferedImage.TYPE_INT_BGR);
Graphics graphics = image.createGraphics();
graphics.drawImage(bufferedimage, 0, 0, widht, height, null);
ImageIO.write(image, format, os);
os.flush();
os.close();
return os;
} /**
* * 裁剪图片方法 *
* @param bufferedImage 图像源 *
* @param startX 裁剪开始x坐标 *
* @param startY 裁剪开始y坐标 *
* @param endX 裁剪结束x坐标 *
* @param endY 裁剪结束y坐标 *
* @return
*/
public static BufferedImage cropImage(BufferedImage Image, int startX, int startY, int endX, int endY) {
int width = Image.getWidth();
int height = Image.getHeight();
if (startX == -1) {
startX = 0;
}
if (startY == -1) {
startY = 0;
}
if (endX == -1) {
endX = width - 1;
}
if (endY == -1) {
endY = height - 1;
}
BufferedImage result = new BufferedImage(endX - startX, endY - startY, 4);
for (int x = startX; x < endX; ++x) {
for (int y = startY; y < endY; ++y) {
int rgb = Image.getRGB(x, y);
result.setRGB(x - startX, y - startY, rgb);
}
}
return result;
} public static void main(String[] args) throws IOException {
totalImg(300,400);
} /**
* 所有图片调用总方法
*/
public static void totalImg(Integer wid,Integer hei) throws IOException, FileNotFoundException {
File file1 = new File("D:/image/");
if (!file1.exists()) {
file1.mkdirs();
}
File file2 = new File("D:/img/");
if (!file2.exists()) {
file2.mkdirs();
}
File file3 = new File("D:/imgCache/");
if (!file3.exists()) {
file3.mkdirs();
}
File file4 = new File("D:/imgCopy/");
if (!file4.exists()) {
file4.mkdirs();
}
//原始图片路径
String imagePath = "D:/image";
File imageFile = new File(imagePath);
File[] imageFiles = imageFile.listFiles();
for (File fimage : imageFiles) {
BufferedImage bufferedimage=ImageIO.read(fimage);
int width = bufferedimage.getWidth();
int height = bufferedimage.getHeight(); OutputStream os = new FileOutputStream(new File("D:/img/"+fimage.getName()));
resizeImage(bufferedimage,width,height,os,"jpg");
os.flush();
os.close();
} //过程图片路径
String path = "D:/img";
dealImg(path,wid,hei,1); String cachePath = "D:/imgCache";
File file = new File(cachePath);
File[] files = file.listFiles();
while(files.length>0) {
dealImg(cachePath,wid,hei,2);
file = new File(path);
files = file.listFiles();
}
} /**
* 处理图片
* @param path 文件夹路径
*/
private static void dealImg(String path,Integer wid,Integer hei,Integer type) {
try {
File file = new File(path);
File[] files = file.listFiles();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
Date beginDate = new Date();
System.out.println(path+"begin:"+sdf.format(beginDate));
for (File f : files) {
BufferedImage bufferedimage=ImageIO.read(f);
Double width = (double) bufferedimage.getWidth();
Double height = (double) bufferedimage.getHeight(); Double w = 0.00;
Double h = 0.00;
if (type==1) {
if (width<wid||height<hei) {
while (width<wid||height<hei) {
width=width*1.1;
height=height*1.1;
}
OutputStream os = new FileOutputStream(new File("D:/imgCache/"+f.getName()));
resizeImage(bufferedimage,width.intValue(),height.intValue(),os,"jpg");
f.delete();
os.flush();
os.close();
continue;
}else if (width>wid&&height>hei) {
while (width>wid&&height>hei) {
width=width*0.9;
height=height*0.9; if (width<wid||height<hei) {
if (width<=height) {
w = wid.doubleValue();
h = ((wid-width)/wid)*height+height;
}else{
h = hei.doubleValue();
w = ((hei-height)/hei)*width+width;
}
}else{
w = width;
h = height;
}
}
width = w;
height = h;
OutputStream os = new FileOutputStream(new File("D:/imgCache/"+f.getName()));
resizeImage(bufferedimage,width.intValue(),height.intValue(),os,"jpg");
f.delete();
os.flush();
os.close();
continue;
}
} //目标将图片裁剪成 宽900,高1200
if (width > wid) {
/*开始x坐标 开始y坐标 结束x坐标 结束y坐标*/
bufferedimage=cropImage(bufferedimage,(int) ((width - wid) / 2),0,(int) (width - (width-wid) / 2),height.intValue());
if (height > hei) {
bufferedimage=cropImage(bufferedimage,0,(int) ((height - hei) / 2),wid,(int) (height - (height - hei) / 2) );
}
}else{
if (height > hei) {
bufferedimage=cropImage(bufferedimage,0,(int) ((height - hei) / 2),width.intValue(),(int) (height - (height - hei) / 2) );
}
}
OutputStream os = new FileOutputStream(new File("D:/imgCopy/"+f.getName()));
ImageIO.write(bufferedimage, "jpg", os); //输出裁剪图片
f.delete();
os.flush();
os.close();
}
Date endDate = new Date();
System.out.println(path+"end:"+sdf.format(endDate));
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
java改变图片文件尺寸的更多相关文章
- java 改变图片的DPI
代码如下: public class test01 { private static int DPI = 300; public static void main(String[] args) { S ...
- java Swing 图片缓冲机制
java Swing 图片缓冲机制: 参考:http://jorneyr.iteye.com/blog/868858#comments package util; import java.awt.ge ...
- 使用Java合并图片、修改DPI
项目中有时候需要对图片进行DPI.合并.拼接等的处理: package com.snow.web.a_test; import java.awt.Graphics; import java.awt.i ...
- Android 使用ColorMatrix改变图片颜色
原文链接:http://blog.csdn.net/janice0529/article/details/49207939 ColorMatrix的颜色矩阵介绍 颜色矩阵M是一个5*4的矩阵,在And ...
- 使用thumbnailator不按照比例,改变图片的大小
我们在平时的开发中,偶尔也会遇到图片处理的问题,比如图片的压缩,按比例改变图片的大小,不按比例改变图片的大小等等. 如果要自己去开发这样一套工具,我觉得大多数人都是做不到的,所以还是学会站在巨人的肩膀 ...
- 使用java修改图片DPI
修改以后可以直接用PS打开看效果 全部使用rt下的类,无需下载其他jar包 import com.sun.image.codec.jpeg.JPEGCodec; import com.sun.imag ...
- java服务器图片压缩的几种方式及效率比较
以下是测试了三种图片压缩方式,通过测试发现使用jdk的ImageIO压缩时间更短,使用Google的thumbnailator更简单,但是thumbnailator在GitHub上的源码已经停止维护了 ...
- 使用javascript改变图片路径
效果预览:http://keleyi.com/keleyi/phtml/jstexiao/16.htm 代码如下: <!DOCTYPE html> <html> <hea ...
- Java中图片压缩处理
原文http://cuisuqiang.iteye.com/blog/2045855 整理文档,搜刮出一个Java做图片压缩的代码,稍微整理精简一下做下分享. 首先,要压缩的图片格式不能说动态图片,你 ...
随机推荐
- HTML 5 学习 (1)
一.HTML的发展 20世纪70年代~80年代之间HTML正式诞生,但是没有一个统一的标准,显示内容比较单一.在netscape上显示的网页可能在ie5中无法正常显示,反之亦然. 1998年,HTML ...
- html5属性placeholder的js 向下兼容支持(jquery版)
placeholder是html5表单特性中比较好用的一条,但是苦于其向下兼容性,所以一般要做向下兼容的站点都不敢用,如果有用到的地方,也是用js简单模拟而实现的,那么有没有一个一劳永逸的方法去解决这 ...
- C++中的类和对象(二)
一,对象的动态建立和释放 1.什么是对象的动态建立和释放 通常我们创建的对象都是由C++编译器为我们在栈内存中创建的,我们无法对其进行生命周期的管理.所以我们需要动态的去建立该对象,因此我们需要在堆内 ...
- 原生Javascript 省市区下拉列表插件
每个电商网站中,都会有收件地址管理模块,用户进行地址操作时,最好不要用户手工进行填写地址. 常见的地址管理界面: 实现插件:PCASClass.js 插件下载地址:http://pan.baidu.c ...
- Make 命令教程 -- 阮一峰
摘自http://www.ruanyifeng.com/blog/2015/02/make.html Make 命令教程 作者: 阮一峰 日期: 2015年2月20日 代码变成可执行文件,叫做编译(c ...
- logback.xml配置详解
先附上本文分析用的例子: <?xml version="1.0" encoding="UTF-8" ?> <configuration> ...
- python 魔法方法之:__getitem__ __setitem__ __delitem__
h2 { color: #fff; background-color: #7CCD7C; padding: 3px; margin: 10px 0px } h3 { color: #fff; back ...
- nyoj 43 24 Point game(dfs暴力)
描述 There Point game. In .The expression mustn't have any other operator except plus,minus,multiply,d ...
- C#泛型详解
我们在编写程序时,经常遇到两个模块的功能非常相似,只是一个是处理int数据,另一个是处理string数据,或者其他自定义的数据类型,但我们没有办法,只能分别写多个方法处理每个数据类型,因为方法的参数类 ...
- Dima and Salad(完全背包)
Dima and Salad time limit per test 1 second memory limit per test 256 megabytes input standard input ...