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做图片压缩的代码,稍微整理精简一下做下分享. 首先,要压缩的图片格式不能说动态图片,你 ...
随机推荐
- has leaked ServiceConnection com.baidu.location.LocationClient
02-06 05:01:52.806: E/ActivityThread(1120): Activity com.project.xxxActivity $1@45fc5af8 that was or ...
- Shader的使用
一.LinearGradient 步骤:①.创建LinearGradient 步骤 ②.将其加入到Paint 步骤一: 构造LinearGradient的参数 public LinearGrad ...
- windows下qtcreator添加ICE库文件
由qtcreator手动添加外部库,会自动生成: win32:CONFIG(release, debug|release): LIBS += -L$$PWD/C:/ZeroC/Ice-/lib/vc1 ...
- 从setTimeout到浏览器线程机制
看高性能javascipt 这本书时,看到这么一句话: Putting scripts at the top of the page in this way typically leads to a ...
- 为TL-WR720N编译带mentohust和njit-client的openwrt固件
openwrt的trunk版已经支持720N了.简单好多. 首先下载openwrt源码,我下的是trunk版 svn co svn://svn.openwrt.org/openwrt/trunk/ 然 ...
- WPF中实现先登录后启动主程序的方法
原文:WPF中实现先登录后启动主程序的方法 我觉得先登录后启动应用主程序是一个很经典的问题,基本上如果要写一个应用程序都会用到这个的小环节.我在这个问题上挣扎了大半天才找到解决方案,我的实现方法我觉得 ...
- Debian安装JAVA环境(转载)
Debian官方没有维护专门的Java软件包,所以不能直接用apt-get工具来安装.在Debian系统中要安装Java,有两种方式,一种是用传统方式:一种是Debian方式. 1. 传统方式 在 s ...
- 蜂窝移动网络是什么,它和 Wi-Fi 有什么区别? 蓝牙和无线有什么区别?
蜂窝移动网络是什么,它和 Wi-Fi 有什么区别? 转自知乎用户的一个回答: 原题问的是"数据流量是什么",不知道怎么又被改成"蜂窝移动网络是什么"了.说下个人 ...
- 关于Makefile.am中与Build相关的变量设置 AM_CPPFLAGS
http://tonybai.com/2010/10/26/about-variables-related-to-building-in-makefile-am/ 关于Makefile.am中与Bui ...
- #include <boost/unordered_set.hpp>
boost.unordered在C++标准容器std::set,std::multiset,std::map和std::multimap的基础上多实现了四个容器:boost::unordered_se ...