| | |
| | | } |
| | | |
| | | /** |
| | | * 压缩为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(); |
| | | } |
| | | |
| | | |