根據(jù)項(xiàng)目需求整理了一下圖片壓縮的方法;
1况褪、前端js壓縮,base64壓縮
function dealImage(base64, w, callback) {
var newImage = new Image();
var quality = 0.6;? ? //壓縮系數(shù)0-1之間
newImage.src = base64;
newImage.setAttribute("crossOrigin", 'Anonymous'); //url為外域時(shí)需要
var imgWidth, imgHeight;
newImage.onload = function () {
imgWidth = this.width;
imgHeight = this.height;
var canvas = document.createElement("canvas");
var ctx = canvas.getContext("2d");
if (Math.max(imgWidth, imgHeight) > w) {
if (imgWidth > imgHeight) {
canvas.width = w;
canvas.height = w * imgHeight / imgWidth;
} else {
canvas.height = w;
canvas.width = w * imgWidth / imgHeight;
}
} else {
canvas.width = imgWidth;
canvas.height = imgHeight;
quality = 0.6;
}
ctx.clearRect(0, 0, canvas.width, canvas.height);
ctx.drawImage(this, 0, 0, canvas.width, canvas.height);
var base64 = canvas.toDataURL("image/jpeg", quality); //壓縮語(yǔ)句
// 如想確保圖片壓縮到自己想要的尺寸,如要求在50-150kb之間,請(qǐng)加以下語(yǔ)句碎罚,quality初始值根據(jù)情況自定
// while (base64.length / 1024 > 150) {
// quality -= 0.01;
// base64 = canvas.toDataURL("image/jpeg", quality);
// }
// 防止最后一次壓縮低于最低尺寸会傲,只要quality遞減合理锅棕,無(wú)需考慮
// while (base64.length / 1024 < 50) {
// quality += 0.001;
// base64 = canvas.toDataURL("image/jpeg", quality);
// }
callback(base64);//必須通過(guò)回調(diào)函數(shù)返回,否則無(wú)法及時(shí)拿到該值
}
}
//使用壓縮
dealImage(oldBase64, 800, printing);
function printing(base64) {
console.log("壓縮后", base64.length / 1024)
}
2淌山、后臺(tái)base64壓縮
import com.sun.syndication.io.impl.Base64;
import net.coobird.thumbnailator.Thumbnails;
import net.coobird.thumbnailator.geometry.Positions;
import sun.misc.BASE64Decoder;
public static String resizeImageTo40K(String base64Img) {
? ? ? ? try {
? ? ? ? ? ? BufferedImage src = base64String2BufferedImage(base64Img);
? ? ? ? ? ? BufferedImage output = Thumbnails.of(src).size(src.getWidth()/3, src.getHeight()/3).asBufferedImage();
? ? ? ? ? ? String base64 = imageToBase64(output);
? ? ? ? ? ? if (base64.length() - base64.length() / 8 * 2 > 40000) {
? ? ? ? ? ? ? ? output = Thumbnails.of(output).scale(1/(base64.length()/40000)).asBufferedImage();
? ? ? ? ? ? ? ? base64 = imageToBase64(output);
? ? ? ? ? ? }
? ? ? ? ? ? return base64;
? ? ? ? } catch (Exception e) {
? ? ? ? ? ? return base64Img;
? ? ? ? }
? ? }
? ? public static BufferedImage base64String2BufferedImage(String base64string) {
? ? ? ? BufferedImage image = null;
? ? ? ? try {
? ? ? ? ? ? InputStream stream = BaseToInputStream(base64string);
? ? ? ? ? ? image = ImageIO.read(stream);
? ? ? ? } catch (IOException e) {
// ? ? ? ? ? ? LOG.info("");
? ? ? ? }
? ? ? ? return image;
? ? }
? ? public static String imageToBase64(BufferedImage bufferedImage) {
? ? ? ? Base64 encoder = new Base64();
? ? ? ? ByteArrayOutputStream baos = new ByteArrayOutputStream();
? ? ? ? try {
? ? ? ? ? ? ImageIO.write(bufferedImage, "jpg", baos);
? ? ? ? } catch (IOException e) {
// ? ? ? ? ? ? LOG.info("");
? ? ? ? System.out.println(e);
? ? ? ? }
? ? ? ? return new String(encoder.encode((baos.toByteArray())));
? ? }
? ? private static InputStream BaseToInputStream(String base64string){
? ? ? ? ByteArrayInputStream stream = null;
? ? ? ? try {
? ? ? ? ? ? BASE64Decoder decoder = new BASE64Decoder();
? ? ? ? ? ? byte[] bytes1 = decoder.decodeBuffer(base64string);
? ? ? ? ? ? stream = new ByteArrayInputStream(bytes1);
? ? ? ? } catch (Exception e) {
? ? ? ? ? ? // TODO: handle exception
? ? ? ? }
? ? ? ? return stream;
? ? }
? ? //base64壓縮
? ? public static void main(String[] args){
? ? ? ? String base64="";
? ? ? ? String s=resizeImageTo40K(base64);
? ? ? ? System.out.println(s);
? ? }
3裸燎、后臺(tái)java 路徑壓縮;
public class ThumbnailatorTest {
? ? /**
? ? *
? ? * @param args
? ? * @throws IOException
? ? */
// ? ? public static void main(String[] args) throws IOException {
// ? ? ? ? ThumbnailatorTest thumbnailatorTest = new ThumbnailatorTest();
//// ? ? ? ? thumbnailatorTest.test1();
//// ? ? ? ? thumbnailatorTest.test2();
//// ? ? ? ? thumbnailatorTest.test3();
//// ? ? ? ? thumbnailatorTest.test4();
//// ? ? ? ? thumbnailatorTest.test5();
//// ? ? ? ? thumbnailatorTest.test6();
//// ? ? ? ? thumbnailatorTest.test7();
//// ? ? ? ? thumbnailatorTest.test8();
//// ? ? ? ? thumbnailatorTest.test9();
// ? ? }
? ? /**
? ? * 指定大小進(jìn)行縮放
? ? *
? ? * @throws IOException
? ? */
? ? private void test1() throws IOException {
? ? ? ? /*
? ? ? ? * size(width,height) 若圖片橫比200小泼疑,高比300小德绿,不變
? ? ? ? * 若圖片橫比200小,高比300大退渗,高縮小到300移稳,圖片比例不變 若圖片橫比200大,高比300小会油,橫縮小到200个粱,圖片比例不變
? ? ? ? * 若圖片橫比200大,高比300大钞啸,圖片按比例縮小几蜻,橫為200或高為300
? ? ? ? */
? ? ? ? Thumbnails.of("C:\\Users\\Administrator\\Downloads\\www.jpg").size(200, 300).toFile("C:\\Users\\Administrator\\Desktop\\www_200x300.jpg");
// ? ? ? ? Thumbnails.of("C:\\Users\\Administrator\\Desktop\\02e853da68681e43fe198c99280861ef.jpg").size(2560, 2048).toFile("C:/image_2560x2048.jpg");
? ? }
? ? /**
? ? * 按照比例進(jìn)行縮放
? ? *
? ? * @throws IOException
? ? */
? ? private void test2() throws IOException {
? ? ? ? /**
? ? ? ? * scale(比例)
? ? ? ? */
? ? ? ? Thumbnails.of("C:\\Users\\Administrator\\Desktop\\02e853da68681e43fe198c99280861ef.jpg").scale(0.25f).toFile("C:\\Users\\Administrator\\Desktop\\image_25%.jpg");
// ? ? ? ? Thumbnails.of("images/test.jpg").scale(1.10f).toFile("C:/image_110%.jpg");
? ? }
? ? /**
? ? * 不按照比例喇潘,指定大小進(jìn)行縮放
? ? *
? ? * @throws IOException
? ? */
? ? private void test3() throws IOException {
? ? ? ? /**
? ? ? ? * keepAspectRatio(false) 默認(rèn)是按照比例縮放的
? ? ? ? */
? ? ? ? Thumbnails.of("C:\\Users\\Administrator\\Desktop\\02e853da68681e43fe198c99280861ef.jpg").size(120, 120).keepAspectRatio(false).toFile("C:\\Users\\Administrator\\Desktop\\image_120x120.jpg");
? ? }
? ? /**
? ? * 旋轉(zhuǎn)
? ? *
? ? * @throws IOException
? ? */
? ? private void test4() throws IOException {
? ? ? ? /**
? ? ? ? * rotate(角度),正數(shù):順時(shí)針 負(fù)數(shù):逆時(shí)針
? ? ? ? */
? ? ? ? Thumbnails.of("images/test.jpg").size(1280, 1024).rotate(90).toFile("C:/image+90.jpg");
? ? ? ? Thumbnails.of("images/test.jpg").size(1280, 1024).rotate(-90).toFile("C:/iamge-90.jpg");
? ? }
? ? /**
? ? * 水印
? ? *
? ? * @throws IOException
? ? */
? ? private void test5() throws IOException {
? ? ? ? /**
? ? ? ? * watermark(位置,水印圖梭稚,透明度)
? ? ? ? */
? ? ? ? Thumbnails.of("images/test.jpg").size(1280, 1024).watermark(Positions.BOTTOM_RIGHT, ImageIO.read(new File("images/watermark.png")), 0.5f)
? ? ? ? ? ? ? ? .outputQuality(0.8f).toFile("C:/image_watermark_bottom_right.jpg");
? ? ? ? Thumbnails.of("images/test.jpg").size(1280, 1024).watermark(Positions.CENTER, ImageIO.read(new File("images/watermark.png")), 0.5f)
? ? ? ? ? ? ? ? .outputQuality(0.8f).toFile("C:/image_watermark_center.jpg");
? ? }
? ? /**
? ? * 裁剪
? ? *
? ? * @throws IOException
? ? */
? ? private void test6() throws IOException {
? ? ? ? /**
? ? ? ? * 圖片中心400*400的區(qū)域
? ? ? ? */
? ? ? ? Thumbnails.of("images/test.jpg").sourceRegion(Positions.CENTER, 400, 400).size(200, 200).keepAspectRatio(false)
? ? ? ? ? ? ? ? .toFile("C:/image_region_center.jpg");
? ? ? ? /**
? ? ? ? * 圖片右下400*400的區(qū)域
? ? ? ? */
? ? ? ? Thumbnails.of("images/test.jpg").sourceRegion(Positions.BOTTOM_RIGHT, 400, 400).size(200, 200).keepAspectRatio(false)
? ? ? ? ? ? ? ? .toFile("C:/image_region_bootom_right.jpg");
? ? ? ? /**
? ? ? ? * 指定坐標(biāo)
? ? ? ? */
? ? ? ? Thumbnails.of("images/test.jpg").sourceRegion(600, 500, 400, 400).size(200, 200).keepAspectRatio(false).toFile("C:/image_region_coord.jpg");
? ? }
? ? /**
? ? * 轉(zhuǎn)化圖像格式
? ? *
? ? * @throws IOException
? ? */
? ? private void test7() throws IOException {
? ? ? ? /**
? ? ? ? * outputFormat(圖像格式)
? ? ? ? */
? ? ? ? Thumbnails.of("images/test.jpg").size(1280, 1024).outputFormat("png").toFile("C:/image_1280x1024.png");
? ? ? ? Thumbnails.of("images/test.jpg").size(1280, 1024).outputFormat("gif").toFile("C:/image_1280x1024.gif");
? ? }
? ? /**
? ? * 輸出到OutputStream
? ? *
? ? * @throws IOException
? ? */
? ? private void test8() throws IOException {
? ? ? ? /**
? ? ? ? * toOutputStream(流對(duì)象)
? ? ? ? */
? ? ? ? OutputStream os = new FileOutputStream("C:/image_1280x1024_OutputStream.png");
? ? ? ? Thumbnails.of("images/test.jpg").size(1280, 1024).toOutputStream(os);
? ? }
? ? /**
? ? * 輸出到BufferedImage
? ? *
? ? * @throws IOException
? ? */
? ? private void test9() throws IOException {
? ? ? ? /**
? ? ? ? * asBufferedImage() 返回BufferedImage
? ? ? ? */
? ? ? ? BufferedImage thumbnail = Thumbnails.of("images/test.jpg").size(1280, 1024).asBufferedImage();
? ? ? ? ImageIO.write(thumbnail, "jpg", new File("C:/image_1280x1024_BufferedImage.jpg"));
? ? }
注:谷歌壓縮方法其中有個(gè)bug颖低,基于ps 格式圖片會(huì)有轉(zhuǎn)換問(wèn)題,需要導(dǎo)入其中包弧烤,代碼無(wú)需修改:
jar包下載可以從:https://mvnrepository.com/