ホームページ  >  記事  >  Java  >  Javaは元の画像サイズを変更せずに圧縮画像を実装します

Javaは元の画像サイズを変更せずに圧縮画像を実装します

王林
王林転載
2020-08-03 16:24:323112ブラウズ

Javaは元の画像サイズを変更せずに圧縮画像を実装します

要件:

2MB を超える画像は、元の画像のサイズを変更せずに 2MB 未満に圧縮する必要があります。

(推奨チュートリアル: java 入門チュートリアル)

依存関係の紹介:

        <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;
}

(ビデオ チュートリアルの推奨: java ビデオ チュートリアル)

画像エンティティ クラス:

@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は元の画像サイズを変更せずに圧縮画像を実装しますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はcsdn.netで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。