Java 读取网络图片存储到本地并生成缩略图

网友投稿 459 2022-10-22


Java 读取网络图片存储到本地并生成缩略图

之前使用 python 爬虫抓取电影网站信息作为自己网站的数据来源,其中包含的图片都是网络图片,会存在这样一个问题:

当原始网站访问速度比较慢时,网站图片加载时间也会变得很慢,而且如果原始网站挂了,图片就直接访问不到了。

此时的用户体验就很不好,所以对此进行了优化:

每次后端启动时会默认开启任务先将未转换的网络图片存储到本地,再把网页中图片列表改为访问本地图片,这样就解决了加载慢的问题,也降低了和原始网站的耦合性,具体步骤如下:

1.创建用于保存图片的文件夹

我的保存路径:F:\images

2.新建 createLocalImage 类用于图片转换

package com.cn.beauty.task;

import java.io.BufferedInputStream;

import java.io.File;

import java.io.FileOutputStream;

import java.io.IOException;

import java.net.HttpURLConnection;

import java.net.URL;

public class createLocalImage {

// 需要保存到本地的根路径

private static String basePath = "F:/";

public static void main(String[] args) {

// 网页图片路径

String destUrl = "http://5b0988e595225.cdn.sohucs.com/images/20200215/349bb3cb88b744dcb67f37dba2f71abf.jpeg";

String filePath = createLocalImageMethod(destUrl);

System.out.println("生成的相对文件路径为" + filePath);

}

private static String createLocalImageMethod(String destUrl) {

FileOutputStream fos = null;

BufferedInputStream bis = null;

HttpURLConnection httpUrl = null;

URL url = null;

int BUFFER_SIZE = 1024;

byte[] buf = new byte[BUFFER_SIZE];

int size = 0;

String filePath = "";

try {

System.out.println("原始图片URL为:" + destUrl);

String[] fileNameArray = destUrl.split("\\/");

if (fileNameArray.length > 1) {

String fileName = fileNameArray[fileNameArray.length - 1];

filePath = "images/" + fileName;

File file = new File(basePath + filePath);

if (!file.exists()) {

url = new URL(destUrl);

httpUrl = (HttpURLConnection) url.openConnection();

httpUrl.connect();

bis = new BufferedInputStream(httpUrl.getInputStream());

fos = new FileOutputStream(basePath + filePath);

while ((size = bis.read(buf)) != -1) {

fos.write(buf, 0, size);

}

fos.flush();

}

// 后续对图片进行缩略图处理,见后面代码

}

} catch (IOException e) {

e.printStackTrace();

} catch (ClassCastException e) {

e.printStackTrace();

http:// } finally {

try {

fos.close();

bis.close();

httpUrl.disconnect();

} catch (IOException e) {

} catch (NullPointerException e) {

}

}

return filePath;

}

}

运行后发现图片已经成功生成:

3.生成缩略图

使用工具类Thumbnails

如果是图片列表的展示,原始图片过大还是会影响加载速度,此时我们可以将图片处理为缩略图进行显示。

我们使用了一个很强大的图片处理工具类:Thumbnails,它支持的功能包括:

按指定大小进行缩放;

按照比例进行缩放;

不按照比例,指定大小进行缩放;

旋转,水印,裁剪;

转化图像格式;

输出到 OutputStream;

输出到 BufferedImage;

这里的需求比较简单,只用到了按指定大小进行缩放的功能。

引入对应 jar 包:

net.coobird

thumbnailator

http:// 0.4.8

在 createLocalImage 方法中添加缩略图生成的代码实现:

String thumbName = fileName.split("\\.")[0] + "_thumb." + fileName.split("\\.")[1];

String thumbPath = basePath + filePath.replace(fileName, thumbName);

//将要转换出的小图文件

File fo = new File(thumbPath);

if (fo.exists()) {

return thumbPath;

}

// 第一个参数是原始图片的路径,第二个是缩略图的路径

Thumbnails.of(basePath + filePath).size(120, 120).toFile(thumbPath);

System.out.println("生成的缩略图路径为:" + thumbPath);

再次运行,发现缩略图已经成功生成:

另一种方法

直接将下面的代码封装成一个util即可,调用示例在main方法中,调用的地方需要引入import java.awt.image.BufferedImage;,还要确保旧文件是存在的

import java.awt.image.BufferedImage;

import java.io.File;

import java.io.FileOutputStream;

import java.io.IOException;

import java.util.HashMap;

import java.util.Map;

import javax.imageio.ImageIO;

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

import com.sun.image.codec.jpeg.JPEGEncodeParam;

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

public class ResizeImage {

public static void main(String[] args) throws IOException {

//windows路径,linux环境下相应修改

String outputFolder = "D:\\test\\";

String fileName = "D:\\test\\test.jpg";

ResizeImage r = new ResizeImage();

int toWidth=220,toHeight=220;

BufferedImage imageList = r.getImageList(fileName,new String[] {"jpg","png","gif"});

r.writeHighQuality("newFile.jpg",r.zoomImage(imageList,toWidth,toHeight),outputFolder);

}

/**

* @Description: 取得图片对象

* @param 要转化的图像的文件夹,就是存放图像的文件夹路径

* @date 2017年5月7日10:48:27

*/

public BufferedImage zoomImage(BufferedImage im, int toWidth , int toHeight) {

BufferedImage result = new BufferedImage(toWidth, toHeight, BufferedImage.TYPE_INT_RGB);

result.getGraphics().drawImage(im.getScaledInstance(toWidth, toHeight, java.awt.Image.SCALE_SMOOTH), 0, 0, null);

return result;

}

/**

* @Description: 取得图片对象

* @param 要转化的图像的文件夹,就是存放图像的文件夹路径

* @date 2017年5月7日10:48:27

*/

public BufferedImage getImageList(String ImgList, String[] type) throws IOException{

Map map = new HashMap();

for(String s : type) {

map.put(s,true);

}

BufferedImage imageList = null;

File file = null;

file = new File(ImgList);

try{

if(file.length() != 0 && map.get(getExtension(file.getName())) != null ){

imageList = javax.imageio.ImageIO.read(file);

}

}catch(Exception e){

imageList = null;

}

return imageList;

}

/**

* 把图片写到磁盘上

* @param im

* @param path 图片写入的文件夹地址

* @param fileName 写入图片的名字

* @date 2017年5月7日10:48:27

*/

public boolean writeToDisk(BufferedImage im, String path, String fileName) {

File f = new File(path + fileName);

String fileType = getExtension(fileName);

if (fileType == null)

return false;

try {

ImageIO.write(im, fileType, f);

im.flush();

return true;

} catch (IOException e) {

return false;

}

}

/**

* @Description: 生成图片

* @param String path , BufferedImage im, String fileFullPath

* @date 2017年5月7日10:48:27

*/

public boolean writeHighQuality(String path , BufferedImage im, String fileFullPath) throws IOException {

FileOutputStream newimage = null;

try {

// 输出到文件流

newimage = new FileOutputStream(fileFullPath+path);

JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(newimage);

JPEGEncodeParam jep = JPEGCodec.getDefaultJPEGEncodeParam(im);

// 压缩质量

jep.setQuality(1f, true);

encoder.encode(im, jep);

//近JPEG编码

newimage.close();

return true;

} catch (Exception e) {

return false;

}

}

/**

* @Description: 取文件名的后缀

* @param String fileName 格式如:cn1100000213EA_1_xnl.jpg

* @date 2017年5月7日10:48:27

*/

public String getExtension(String fileName) {

try {

return fileName.split("\\.")[fileName.split("\\.").length - 1];

} catch (Exception e) {

return null;

}

}

以上就是Java 读取网络图片存储到本地并生成缩略图的详细内容,更多关于Java 图片存储到本地并生成缩略图的资料请关注我们其它相关文章!


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:npm速度过慢的解决方案
下一篇:CentOS网络接口配置文件ifcfg-eth详解
相关文章

 发表评论

暂时没有评论,来抢沙发吧~