import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGImageEncoder;
import com.xiaoleilu.hutool.util.ZipUtil;
import javafx.scene.shape.Path;
import org.apache.commons.io.FileUtils;
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.*;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
/**
* @author: jiangjiabin
* @date: 2019/1/17
*/
public class TestsApplication {
public static void main(String[] args) throws IOException {
System.out.println("start.....");
String url = "http://img13.360buyimg.com/n1/jfs/t1/23782/15/2182/146014/5c1a1106Efd17752a/bb86a6aa9ef459c2.jpg";
String localpath = "C:\\Users\\jiangjiabin\\Desktop\\nice.jpg";
String mainDir = "D:" + File.separator + "picture";
String fileName = "D:" + File.separator + "picture" + File.separator + "pic" + System.currentTimeMillis() + ".jpg";
String newName = "D:" + File.separator + "picture" + File.separator + "newPic" + System.currentTimeMillis() + ".jpg";
//test4
byte[] bytes = getImageFromLocalByUrl(localpath);
writeImageToDisk(bytes, fileName);
resizeImage(fileName, newName, 1000, "jpg");
//test3
// byte[] bytes = getImageFromLocalByUrl(localpath);
// writeImageToDisk(bytes, fileName);
// ZipUtil.zip(fileName);
// changeSize(fileName, newName, "jpg", 2, true);
//test2
// byte[] imageBytes = getImageFromNetByUrl(url);
// writeImageToDisk(imageBytes, fileName);
//test 1
// readImgToLocal(url, mainDir + File.separator + "finished", "img.png");
// //通过zip工具包压缩
// ZipUtil.zip(mainDir);
// System.out.println("end.....");
}
/**
* 通过url保存图片
*
* @param srcPath 图片url
* @param directory 保存到本地的目录
* @param fileName 文件名
*/
private static void readImgToLocal(String srcPath, String directory, String fileName) {
URL source;
try {
source = new URL(srcPath);
File destination = FileUtils.getFile(directory, fileName);
FileUtils.copyURLToFile(source, destination);
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 根据地址获得数据的字节流
*
* @param strUrl 网络连接地址
* @return
*/
public static byte[] getImageFromNetByUrl(String strUrl) {
try {
URL url = new URL(strUrl);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
conn.setConnectTimeout(5 * 1000);
InputStream inStream = conn.getInputStream();// 通过输入流获取图片数据
byte[] btImg = readInputStream(inStream);// 得到图片的二进制数据
return btImg;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* 从输入流中获取数据
*
* @param inStream 输入流
* @return
* @throws Exception
*/
public static byte[] readInputStream(InputStream inStream) throws Exception {
ByteArrayOutputStream outStream = new ByteArrayOutputStream();
byte[] buffer = new byte[10240];
int len;
while ((len = inStream.read(buffer)) != -1) {
outStream.write(buffer, 0, len);
}
inStream.close();
return outStream.toByteArray();
}
/**
* 将图片写入到磁盘
*
* @param img 图片数据流
* @param fileName 文件保存时的路径及名字名称, 可以这样指定路径: fileName = "D:" + File.separator + "图片集" + File.separator + "pic.jpg"
*/
public static void writeImageToDisk(byte[] img, String fileName) {
try {
File file = new File(fileName);
if (!file.exists()) {
File files = new File(file.getParent());
files.mkdirs();
file.createNewFile();
}
FileOutputStream fops = new FileOutputStream(file);
fops.write(img);
fops.flush();
fops.close();
System.out.println("图片已经写入" + fileName);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 根据地址获得数据的字节流
*
* @param strUr 本地连接地址
* @return
*/
public static byte[] getImageFromLocalByUrl(String strUrl) {
try {
File imageFile = new File(strUrl);
InputStream inStream = new FileInputStream(imageFile);
byte[] btImg = readInputStream(inStream);// 得到图片的二进制数据
return btImg;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* 改变图片的大小到宽为size,然后高随着宽等比例变化
* @param is 上传的图片的输入流
* @param os 改变了图片的大小后,把图片的流输出到目标OutputStream
* @param size 新图片的宽
* @param format 新图片的格式
* @throws IOException
*/
public static OutputStream resizeImage(String fileName, String newFileName, int size, String format) throws IOException {
InputStream is = new FileInputStream(new File(fileName));
OutputStream os = new FileOutputStream(new File(newFileName));
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();
return os;
}
}
其中用到的额外的包, 在压缩图片时用到的:
<dependency> <groupId>com.xiaoleilu</groupId> <artifactId>hutool-all</artifactId> <version>3.0.5</version> </dependency> <!-- https://mvnrepository.com/artifact/org.apache.directory.studio/org.apache.commons.io --> <dependency> <groupId>org.apache.directory.studio</groupId> <artifactId>org.apache.commons.io</artifactId> <version>2.4</version> </dependency>