| | |
| | | * 处理图片文件 |
| | | */ |
| | | 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<>(); |
| | | |
| | | // 读取图片 |
| | |
| | | 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; |
| | | } |
| | | |
| | |
| | | } |
| | | |
| | | /** |
| | | * 压缩为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(); |
| | | } |
| | | |
| | | |
| | |
| | | * 处理视频文件:生成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 { |
| | |
| | | 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; |
| | | } |