中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

java如何實現壓縮圖片且不改變原圖尺寸

發布時間:2020-08-04 09:15:18 來源:億速云 閱讀:586 作者:Leah 欄目:編程語言

java如何實現壓縮圖片且不改變原圖尺寸?針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。

需求:

大于2MB的圖片需要壓縮到2MB以下,且不改變原圖的尺寸。

引入依賴:

        <dependency>
            <groupId>net.coobird</groupId>
            <artifactId>thumbnailator</artifactId>
            <version>0.4.8</version>
        </dependency>

附件實體類:

@Builder
@NoArgsConstructor
@AllArgsConstructor
@Data
public class FileCO {
    /**
     * 附件字節流
     */
    private byte[] fileContent;

    /**
     * 附件OID
     */
    private UUID attachmentOid;
}

圖片實體類:

@Builder
@NoArgsConstructor
@AllArgsConstructor
@Data
public class ImageInfo {

    /**
     * 圖片字節流
     */
    private byte[] imageBytes;

    /**
     * 圖片是否進行壓縮
     */
    private Boolean compressFlag;

    /**
     * 圖片寬度
     */
    private Integer width;

    /**
     * 圖片高度
     */
    private Integer height;
}

圖片壓縮工具類:

@Slf4j
public class ImageUtils {

    /**
     * 合法圖片大小為2MB
     */
    private static final Long LEGAL_IMAGE_SIZE = 1024 * 2L;

    /**
     * 圖片壓縮 當圖片大小大于2MB進行等比例壓縮
     * 不修改圖片尺寸進行壓縮
     *
     * @param fileCO
     * @return
     */
    public static ImageInfo compressImageForScale(FileCO fileCO) throws IOException {
        byte[] imageBytes = fileCO.getFileContent();
        UUID attachmentOid = fileCO.getAttachmentOid();
        try {
            BufferedImage sourceImage = ImageIO.read(new ByteArrayInputStream(imageBytes));
            //高度
            int height = sourceImage.getHeight();
            //寬度
            int width = sourceImage.getWidth();
            if (imageBytes.length <= 0 || imageBytes.length < LEGAL_IMAGE_SIZE * 1024) {
                return ImageInfo.builder()
                        .imageBytes(imageBytes)
                        .width(width)
                        .height(height)
                        .compressFlag(false)
                        .build();
            }
            long srcSize = imageBytes.length;
            double accuracy = getAccuracy(srcSize / 1024);

            while (imageBytes.length > LEGAL_IMAGE_SIZE * 1024) {
                ByteArrayInputStream inputStream = new ByteArrayInputStream(imageBytes);
                ByteArrayOutputStream outputStream = new ByteArrayOutputStream(imageBytes.length);
                Thumbnails.of(inputStream)
                        .scale(1f)
                        .outputQuality(accuracy)
                        .toOutputStream(outputStream);
                imageBytes = outputStream.toByteArray();
            }
            log.info("【圖片壓縮】附件OID={} | 圖片原大小={}kb | 壓縮后大小={}kb",
                    attachmentOid, srcSize / 1024, imageBytes.length / 1024);
            return ImageInfo.builder()
                    .imageBytes(imageBytes)
                    .width(width)
                    .height(height)
                    .compressFlag(true)
                    .build();
        } catch (Exception e) {
            log.error("【圖片壓縮】msg=圖片壓縮失敗!", e);
            throw e;
        }
    }

    /**
     * 計算壓縮精度
     *
     * @param size
     * @return
     */
    private static double getAccuracy(long size) {
        double accuracy;
        //圖片大小小于4M,壓縮精度為0.44;否則精度為0.4
        if (size <= 2048 * 2) {
            accuracy = 0.44;
        } else {
            accuracy = 0.4;
        }
        return accuracy;
    }
}

關于java如何實現壓縮圖片且不改變原圖尺寸問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

鲁山县| 双桥区| 彭泽县| 黄龙县| 武宣县| 广饶县| 南京市| 禄劝| 郓城县| 吴旗县| 常山县| 阳江市| 安图县| 巴南区| 贞丰县| 昌都县| 且末县| 鄂温| 吕梁市| 高淳县| 阿巴嘎旗| 南汇区| 上虞市| 蛟河市| 农安县| 同德县| 石棉县| 洪湖市| 沈阳市| 巴里| 诏安县| 铁岭县| 视频| 政和县| 伊通| 新泰市| 安宁市| 桃江县| 手游| 高尔夫| 定州市|