java 压缩图片byte[]
时间: 2025-04-07 09:02:29 浏览: 16
### Java 中压缩图片字节数组的方法
在 Java 中处理图片并将其转换为字节数组后进行压缩,通常可以通过 `javax.imageio` 和第三方库(如 Apache Commons Imaging 或 TwelveMonkeys ImageIO)来实现。以下是具体方法:
#### 使用 JPEG 压缩
可以利用 `ImageWriter` 类及其参数设置功能来进行压缩操作。
```java
import javax.imageio.IIOImage;
import javax.imageio.ImageIO;
import javax.imageio.ImageWriteParam;
import javax.imageio.ImageWriter;
import javax.imageio.stream.MemoryCacheImageOutputStream;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
public class ImageCompressor {
public static byte[] compressImage(byte[] imageData, float quality) throws Exception {
ByteArrayInputStream bis = new ByteArrayInputStream(imageData);
BufferedImage image = ImageIO.read(bis);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageWriter writer = ImageIO.getImageWritersByFormatName("jpg").next(); // 设置输出格式为 JPG
MemoryCacheImageOutputStream output = new MemoryCacheImageOutputStream(baos);
writer.setOutput(output);
ImageWriteParam param = writer.getDefaultWriteParam();
if (param.canWriteCompressed()) { // 如果支持写入压缩数据
param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT); // 显式指定压缩模式
param.setCompressionQuality(quality); // 质量范围:0.0f 到 1.0f
}
writer.write(null, new IIOImage(image, null, null), param); // 写入带参数的图像
writer.dispose();
output.close();
return baos.toByteArray();
}
}
```
上述代码通过调整质量参数 `quality` 来控制压缩程度[^1]。较低的质量值会减少文件大小但降低画质;较高的质量值则保留更多细节但增加存储需求。
#### 将图片转为 TIFF 并应用 CCITT T.6 压缩
如果目标是将图片保存为带有特定编码方式(例如 CCITT Group 4 Compression/T.6)的 TIFF 文件,则需依赖更高级别的工具包完成此任务。下面展示了一个可能的例子:
```java
import com.sun.media.jai.codec.TIFFEncodeParam; // 需要额外引入 JAI 库
import javax.media.jai.JAI;
import javax.media.jai.RenderedOp;
import java.awt.image.renderable.ParameterBlock;
import java.io.ByteArrayOutputStream;
public class TiffConverter {
public static byte[] convertToTiffWithCCITTCOMPRESSION(BufferedImage bi) throws IOException{
ParameterBlock pb=new ParameterBlock();
pb.addSource(bi);
RenderedOp rop=JAI.create("encode",pb,new TIFFEncodeParam());
ByteArrayOutputStream bos=new ByteArrayOutputStream();
OutputStream os=bos;
ImageEncoder encoder=ImageCodec.createImageEncoder("tiff",os,null);
TIFFEncodeParam tep=(TIFFEncodeParam)(encoder.getParameterClass().newInstance());
tep.setCompression(TIFFEncodeParam.COMPRESSION_CCITT_T_6);
encoder.encode(rop,tep);
return bos.toByteArray();
}
}
```
注意该片段假设存在某些条件下的可用性以及适当配置环境变量指向所需类路径下加载必要资源[^2]。
对于简单的图像到字节数组再进一步转化为 Base64 字符串的过程如下所示:
```java
import android.graphics.Bitmap;
import android.util.Base64;
import java.io.ByteArrayOutputStream;
public String bitmapToBase64(Bitmap bm){
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
bm.compress(Bitmap.CompressFormat.PNG, 100, byteArrayOutputStream);// PNG 不含损失型压缩
byte[] b = byteArrayOutputStream.toByteArray();
return Base64.encodeToString(b, Base64.DEFAULT);
}
```
这里展示了 Android SDK 下的一个实例[^3],其中包含了如何创建位图对象并将之序列化成字符串形式的内容。
阅读全文
相关推荐


















