亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

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

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

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

石泉县| 清丰县| 邹城市| 威信县| 南和县| 平陆县| 土默特右旗| 太湖县| 章丘市| 郑州市| 江西省| 漯河市| 商都县| 临城县| 赣榆县| 同德县| 弥勒县| 齐齐哈尔市| 鄂尔多斯市| 元谋县| 鄂温| 萍乡市| 富阳市| 柘城县| 舞阳县| 宁津县| 云梦县| 奉节县| 西平县| 沭阳县| 紫阳县| 武穴市| 嘉义县| 山东省| 太仆寺旗| 罗城| 钟山县| 青河县| 漳浦县| 巴青县| 云龙县|