在Java中,我们可以使用Apache Commons Imaging库(原名Sanselan)或者ImageIO和BufferedImage来压缩图片至指定大小。以下是一个简单的示例,该示例将图片压缩到小于2MB: ```java import java.awt.*; import java.awt.image.BufferedImage; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.IOException; import javax.imageio.ImageIO; public class ImageCompressor { public static void compressToSize(File inputFile, File outputFile, long maxFileSize) throws IOException { BufferedImage originalImage = ImageIO.read(inputFile); double compressionQuality = 1.0; // Start with highest quality // Loop until the image is smaller than the max file size while (true) { ByteArrayOutputStream baos = new ByteArrayOutputStream(); ImageIO.write(originalImage, "jpg", baos); byte[] imageData = baos.toByteArray(); if (imageData.length < maxFileSize) { break; // Image is small enough, write it out and exit loop } // Decrease quality for next iteration compressionQuality -= 0.05; if (compressionQuality < 0.0) { throw new IllegalArgumentException("Failed to compress image to less than " + maxFileSize + " bytes."); } // Re-encode the image with lower quality ImageWriter writer = ImageIO.getImageWritersByFormatName("jpg").next(); ImageWriteParam param = writer.getDefaultWriteParam(); param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT); param.setCompressionQuality((float) compressionQuality); ImageOutputStream ios = ImageIO.createImageOutputStream(outputFile); writer.setOutput(ios); writer.write(null, new IIOImage(originalImage, null, null), param); ios.close(); writer.dispose(); originalImage = ImageIO.read(outputFile); // Reload the compressed image for the next iteration } // Write the final image to output file ImageIO.write(originalImage, "jpg", outputFile); } public static void main(String[] args) throws IOException { File inputFile = new File("input.jpg"); File outputFile = new File("output.jpg"); long maxFileSize = 2 * 1024 * 1024; // 2 MB compressToSize(inputFile, outputFile, maxFileSize); } } ``` 注意:这个代码会尽可能地保持图像的质量,同时将其大小压缩到指定的限制内。它可能无法保证一定能达到目标大小,因为在某些情况下,即使将质量设置得非常低,文件大小仍然可能超过预期的目标大小。此示例仅支持JPEG格式的图片压缩,如果需要处理其他格式如PNG等,需要做相应的调整。 [2024-02-27 09:42:39 | AI写代码神器 | 576点数解答]