以前は、Pythonクローラーを使用して、Webサイトのデータソースとして映画のWebサイト情報を取得していましたが、そこに含まれる画像はすべてネットワーク画像でした。次のような問題が発生します。
元のウェブサイトのアクセス速度が比較的遅い場合、ウェブサイトの写真の読み込み時間も非常に遅くなり、元のウェブサイトがダウンしていると、写真に直接アクセスできなくなります。
現時点でのユーザーエクスペリエンスは非常に悪いため、これは最適化されています。
バックエンドが開始されるたびに、タスクはデフォルトで開かれます。まず、変換されていないネットワーク画像をローカルに保存し、次にWebページの画像リストを変更してローカル画像にアクセスします。これにより、読み込みが遅いという問題が解決され、結合が減少します。元のウェブサイトで。具体的な手順は次のとおりです。
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();
} finally {
try {
fos.close();
bis.close();
httpUrl.disconnect();
} catch (IOException e) {
} catch (NullPointerException e) {
}
}
return filePath;
}
}
実行後、イメージが正常に生成されたことがわかります。
3.サムネイルを生成します
画像一覧表示の場合、元の画像が大きすぎるか、読み込み速度に影響がありますので、この時点でサムネイルとして処理して表示することができます。
非常に強力な画像処理ツールクラスであるサムネイルを使用します。サムネイルは、次のような機能をサポートします。
- 指定されたサイズに従ってスケーリングします。
- 比率に応じてスケーリングします。
- スケールに従ってスケーリングせず、サイズを指定します。
- 回転、透かし、トリミング;
- 画像形式を変換します。
- OutputStreamへの出力;
- BufferedImageへの出力;
ここでの要件は比較的単純で、指定されたサイズにスケーリングする機能のみが使用されます。
対応するjarパッケージを紹介します。
<dependency>
<groupId>net.coobird</groupId>
<artifactId>thumbnailator</artifactId>
<version>0.4.8</version>
</dependency>
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);
もう一度実行して、サムネイルが正常に生成されたことを確認します。