
正文
图像有损压缩java代码 图像有损压缩是可逆的吗
提示:扫一扫查出行【扫一扫了解最新限行尾号】
复制提示
求助java压缩图片存储大小的方法
可以使用Draw这个类图像有损压缩java代码,通过改变像素来改变存储大小,实例如下图像有损压缩java代码:
public static boolean compressPic(String srcFilePath, String descFilePath) throws IOException {
File file = null;
BufferedImage src = null;
FileOutputStream out = null;
ImageWriter imgWrier;
ImageWriteParam imgWriteParams;
// 指定写图片图像有损压缩java代码的方式为 jpg
imgWrier = ImageIO.getImageWritersByFormatName("jpg").next();
imgWriteParams = new javax.imageio.plugins.jpeg.JPEGImageWriteParam(
null);
// 要使用压缩,必须指定压缩方式为MODE_EXPLICIT
imgWriteParams.setCompressionMode(imgWriteParams.MODE_EXPLICIT);
// 这里指定压缩图像有损压缩java代码的程度,参数qality是取值0~1范围内,
imgWriteParams.setCompressionQuality((float) 1);
imgWriteParams.setProgressiveMode(imgWriteParams.MODE_DISABLED);
ColorModel colorModel =ImageIO.read(new File(srcFilePath)).getColorModel();// ColorModel.getRGBdefault();
// 指定压缩时使用的色彩模式
// imgWriteParams.setDestinationType(new javax.imageio.ImageTypeSpecifier(
// colorModel, colorModel.createCompatibleSampleModel(16, 16)));
imgWriteParams.setDestinationType(new javax.imageio.ImageTypeSpecifier(
colorModel, colorModel.createCompatibleSampleModel(16, 16)));
try {
if (isBlank(srcFilePath)) {
return false;
} else {
file = new File(srcFilePath);System.out.println(file.length());
src = ImageIO.read(file);
out = new FileOutputStream(descFilePath);
imgWrier.reset();
// 必须先指定 out值,才能调用write方法, ImageOutputStream可以通过任何
// OutputStream构造
imgWrier.setOutput(ImageIO.createImageOutputStream(out));
// 调用write方法,就可以向输入流写图片
imgWrier.write(null, new IIOImage(src, null, null),
imgWriteParams);
out.flush();
out.close();
}
} catch (Exception e) {
e.printStackTrace();
return false;
}
return true;
}
public static boolean isBlank(String string) {
if (string == null || string.length() == 0 || string.trim().equals("")) {
return true;
}
return false;
}
相关问答
Q1: 有损压缩算法
基本的分为两大类:有损和无损。
有损压缩:主要是一些量化算法,比如a率,u率,lloyds最优量化。
无损压缩:主要是一些编码算法,比如子带编码,差分编码,哈夫曼编码等。
另外时频变换虽然没压缩效果,但是是很好的压缩工具,比如fft,dct等。
最后就是压缩感知稀疏重建等。
由于信息丢失意味着在误差和比特率之间进行一些权衡,我们首先考虑失真度量---例如,平方误差。本文引入了不同的量化器,每个量化器都具有不同的失真行为。许多有损数据压缩算法开发的数学基础是随机过程的研究。
介绍:
当图像直方图相对平坦时,使用无损压缩技术(例如,霍夫曼编码,算术编码,LZW)的图像数据的压缩比较低。对于需要更高压缩比的多媒体应用中的图像压缩,通常采用有损方法。在有损压缩中,压缩图像通常与原始图像不同,但在感知上与原始图像近似。为了定量描述近似值与原始数据的接近程度,需要某种形式的失真度量。
失真测量:
失真度量是一种数学量,它使用一些失真标准指定近似值与其原始值的接近程度。在查看压缩数据时,很自然地会根据原始数据和重建数据之间的数值差异来考虑失真。 然而,当要压缩的数据是图像时,这样的度量可能不会产生预期的结果。
例如,如果重建的图像与原始图像相同,只是它被向右移动一条垂直扫描线,那么普通的人类观察者将难以将其与原始图像区分开,因此可以得出结论:失真很小。 然而,当以数字方式执行计算时,由于重建图像的各个像素的大的变化,我们发现大的失真。问题是我们需要一种感知失真的测量,而不是一种更天真的数值方法。然而,对感知扭曲的研究超出了本书的范围。
在已经定义的许多数值失真度量中,我们提出了图像压缩中最常用的三种。如果我们对平均像素差异感兴趣,则经常使用均方误差(MSE)。 它被定义为
Q2: JAVA压缩至32K以下后的图片base64码
Java实现图片与Base64编码互转
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;
public class Base64Image {
public static void main(String[] args) {
// 测试从Base64编码转换为图片文件
String strImg = "自己写哈";
GenerateImage(strImg, "D:\\wangyc.jpg");
// 测试从图片文件转换为Base64编码
System.out.println(GetImageStr("d:\\wangyc.jpg"));
}
public static String GetImageStr(String imgFilePath) {// 将图片文件转化为字节数组字符串,并对其进行Base64编码处理
byte[] data = null;
// 读取图片字节数组
try {
InputStream in = new FileInputStream(imgFilePath);
data = new byte[in.available()];
in.read(data);
in.close();
} catch (IOException e) {
e.printStackTrace();
}
// 对字节数组Base64编码
BASE64Encoder encoder = new BASE64Encoder();
return encoder.encode(data);// 返回Base64编码过的字节数组字符串
}
public static boolean GenerateImage(String imgStr, String imgFilePath) {// 对字节数组字符串进行Base64解码并生成图片
if (imgStr == null) // 图像数据为空
return false;
BASE64Decoder decoder = new BASE64Decoder();
try {
// Base64解码
byte[] bytes = decoder.decodeBuffer(imgStr);
for (int i = 0; i bytes.length; ++i) {
if (bytes[i] 0) {// 调整异常数据
bytes[i] += 256;
}
}
// 生成jpeg图片
OutputStream out = new FileOutputStream(imgFilePath);
out.write(bytes);
out.flush();
out.close();
return true;
} catch (Exception e) {
return false;
}
}
}
Q3: java如何实现把一个大图片压缩到指定大小的图片且长宽比不变
java要实现把一个大图片压缩到指定大小图像有损压缩java代码的图片且长宽比不变可以尝试以下操作:
建立一个AffineTransform
AffineTransform(double m00, double m10, double m01, double m11, double m02, double m12)
转换矩阵,缩放比较简单(矩阵可以干很多事情,想做图像处理软件可以研究下)
[ x'] [ m00 m01 m02 ] [ x ] [ m00x + m01y + m02 ]
[ y'] = [ m10 m11 m12 ] [ y ] = [ m10x + m11y + m12 ]
[ 1 ] [ 0 0 1 ] [ 1 ] [ 1 ]
10倍比较难算(根号10啊,当然图像有损压缩java代码你想算也行),9倍好点(9的开方是3),m00为1/3,m01为0,m02为0,m10为0,m11为1/3,m12为0。
再建一个AffineTransformOp,把上面的转换传进去
AffineTransformOp(AffineTransform xform, int interpolationType)
最后调用AffineTransformOp的BufferedImage filter(BufferedImage src, BufferedImage dst) ,src传原图片,返回值就是想要的Image,注意是返回值,不是dst,不明白可以看下Java API
Q4: 求一个Java无损压缩图片的示例,把原图片复制到指定目录,按原图比例改变尺寸,不影响图片质量。
一般都是大尺寸变小尺寸图像有损压缩java代码,肯定有损图像有损压缩java代码的。
不知道你的无损是什么意思图像有损压缩java代码,意思是变小尺寸了还能变大也像以前一样清晰图像有损压缩java代码?
好像有种“矢量图片”就是可以随意放大缩小并且无损,缺点就是图片很占空间。
图像有损压缩java代码的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于图像有损压缩是可逆的吗、图像有损压缩java代码的信息别忘了在本站进行查找喔。







