最近在写一个远程监控程序,要对屏幕截图,发送到另一台电脑。
网上找到了两种图像压缩和解压的方法
1.
//压缩
public static ByteArrayOutputStream encodeImage(BufferedImage image)throws ImageFormatException, IOException{
ByteArrayOutputStream out = new ByteArrayOutputStream();
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
JPEGEncodeParam param = encoder.getDefaultJPEGEncodeParam(image);
param.setQuality(0.5f, false);
encoder.setJPEGEncodeParam(param);
encoder.encode(image);
return out;
}
//解压
public static BufferedImage decodeImage(ByteArrayInputStream in)throws ImageFormatException, IOException{
com.sun.image.codec.jpeg.JPEGImageDecoder decoder = JPEGCodec.createJPEGDecoder(in);
BufferedImage image = decoder.decodeAsBufferedImage();
in.close();
return image;
}
2.
//压缩
private ByteArrayOutputStream gzip(ByteArrayOutputStream bas) throws IOException{
ByteArrayOutputStream zippedBas = new ByteArrayOutputStream();
GZIPOutputStream gz = new GZIPOutputStream(zippedBas);
gz.write(bas.toByteArray());
gz.flush();
gz.close();
return zippedBas;
}
//用GZIPInputStream 解压,直接从流中读取就行
3.还有就是用ImageIO.write()方法也很好用。
比较:
我发现对于比较复杂的图像(比如桌面背景),用ImageIO.write(),保存为png格式的会比jpg占空间小,但jpg也还行;但是一般的图像(比如打开word文档或浏览网页时的屏幕图像这种有一大堆空白的)用jpg比较小。另外,我用第一和第二种方法相结合,先 JPEGImageEncoder压缩后在GZip压缩,效果还行。当然图像质量差了很多,不过对于远程监控足够了