zqy
6 天以前 6d7daf7b789b65a5f2837208b6b0cb8fa52a3367
zhang-content/src/main/java/com/ruoyi/service/impl/VideoProcessService.java
@@ -75,7 +75,7 @@
     * 处理图片文件
     */
    public Map<String, Object> processImage(File file, int width, int height,
                                            float quality, String format,boolean deleteY) throws IOException {
                                            float quality, String format) throws IOException {
        Map<String, Object> result = new HashMap<>();
        // 读取图片
@@ -108,11 +108,6 @@
        result.put("compressedHeight", height > 0 ? height : originalHeight);
        result.put("base64", dataUrl);
        result.put("message", "图片压缩成功");
        if (deleteY) {
            file.delete();
            result.put("originalDeleted", false);
            result.put("message", "图片压缩成功");
        }
        return result;
    }
@@ -225,29 +220,57 @@
    }
    /**
     * 压缩为PNG格式
     * 压缩为PNG格式(兼容性修复)
     */
    private void compressAsPng(BufferedImage image, ByteArrayOutputStream output, int compressionLevel)
        throws IOException {
        Iterator<ImageWriter> writers = ImageIO.getImageWritersByFormatName("png");
        if (!writers.hasNext()) {
            ImageIO.write(image, "png", output);
            // 如果没有PNG编码器,使用默认方式
            boolean written = ImageIO.write(image, "png", output);
            if (!written) {
                throw new IOException("无法写入PNG格式");
            }
            return;
        }
        ImageWriter writer = writers.next();
        ImageWriteParam param = writer.getDefaultWriteParam();
        try {
            ImageWriteParam param = writer.getDefaultWriteParam();
        // PNG的压缩级别(0-9,0最快但压缩率低,9最慢但压缩率高)
        if (compressionLevel >= 0) {
            param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
            param.setCompressionType("Deflate");
            param.setCompressionQuality(Math.max(0.0f, Math.min(1.0f, compressionLevel / 9.0f)));
            // PNG的压缩级别(0-9,0最快但压缩率低,9最慢但压缩率高)
            if (compressionLevel >= 0) {
                try {
                    // 先检查是否支持压缩模式
                    if (param.canWriteCompressed()) {
                        param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
                        // 检查是否支持Deflate压缩类型
                        String[] compressionTypes = param.getCompressionTypes();
                        if (compressionTypes != null) {
                            for (String type : compressionTypes) {
                                if ("Deflate".equalsIgnoreCase(type)) {
                                    param.setCompressionType("Deflate");
                                    break;
                                }
                            }
                        }
                        param.setCompressionQuality(Math.max(0.0f, Math.min(1.0f, compressionLevel / 9.0f)));
                    } else {
                        // 如果不支持压缩,使用默认设置
                        log.debug("PNG编码器不支持压缩设置,使用默认压缩");
                    }
                } catch (UnsupportedOperationException e) {
                    // 捕获不支持的操作异常,继续使用默认设置
                    log.warn("PNG压缩设置不被支持: {}", e.getMessage());
                }
            }
            writer.setOutput(new MemoryCacheImageOutputStream(output));
            writer.write(null, new IIOImage(image, null, null), param);
        } finally {
            writer.dispose();
        }
        writer.setOutput(new MemoryCacheImageOutputStream(output));
        writer.write(null, new IIOImage(image, null, null), param);
        writer.dispose();
    }
@@ -259,7 +282,7 @@
     * 处理视频文件:生成Base64编码的封面 (使用JavaCV)
     */
    public Map<String, Object> processVideo(File file, int width, int height,
                                            float quality, String format, boolean deleteY) {
                                            float quality, String format) {
        Map<String, Object> result = new HashMap<>();
        try {
@@ -300,15 +323,6 @@
            log.error("视频封面生成失败", e);
            result.put("success", false);
            result.put("message", "封面生成失败: " + e.getMessage());
        } finally {
            // 清理临时文件
            if (deleteY && file != null && file.exists()) {
                try {
                    file.delete();
                } catch (Exception e) {
                    log.warn("删除临时视频文件时出错", e);
                }
            }
        }
        return result;
    }