‘壹’ 我在用java进行图片压缩时,遇到130MB 的图片是报错 , 像十几MB时不会出错,
Runtime.getRuntime().maxMemory(),查看一下jvm最大内存,若小了,可通过java参数来设置,如 java -Xmx1024m Test,将最大堆空间设为1024m
‘贰’ 用java能实现JPEG压缩算法吗
BufferedImageimage=newBufferedImage(w,h,BufferedImage.TYPE_INT_RGB);
image.getGraphics().drawImage(img,0,0,w,h,null);//绘制缩小后的图
FiledestFile=newFile("C:\tmp1.jpg");
FileOutputStreamout=newFileOutputStream("C:\tmp2.jpg");//输出到文件流
JPEGImageEncoderencoder=JPEGCodec.createJPEGEncoder(out);
encoder.encode(image);
out.close();
‘叁’ JPG、GIF、PNG和BMP格式的图片各有什么优点和缺点
JPG、GIF、PNG和BMP有以下优缺点:
1、优点。
JPG:JPEG图片格式的设计目标,是在不影响人类可分辨的图片质量的前提下,尽可能的压缩文件大小。这意味着JPEG去掉了一部分图片的原始信息,也即是进行了有损压缩。JPEG的图片的优点,是采用了直接色,得益于更丰富的色彩,JPEG非常适合用来存储照片,用来表达更生动的图像效果,比如颜色渐变。
GIF:GIF是无损的,采用GIF格式保存图片不会降低图片质量。但得益于数据的压缩,GIF格式的图片,其文件大小要远小于BMP格式的图片。文件小,是GIF格式的优点,同时,GIF格式还具有支持动画以及透明的优点。
PNG:PNG是一种比较新的图片格式,PNG-8是非常好的GIF格式替代者,在可能的情况下,应该尽可能的使用PNG-8而不是GIF,因为在相同的图片效果下,PNG-8具有更小的文件体积。
BMP:这是一种比较老的图片格式。BMP是无损的,但同时这种图片格式几乎没有对数据进行压缩,所以BMP格式的图片通常具有较大的文件大小。虽然同时支持索引色和直接色是一个优点
2、缺点
JPG:与GIF相比,JPEG不适合用来存储企业Logo、线框类的图。因为有损压缩会导致图片模糊,而直接色的选用,又会导致图片文件较GIF更大。
GIF:GIF格式仅支持8bit的索引色,即在整个图片中,只能存在256种不同的颜色。
PNG:PNG-8本身也是支持动画的,只是浏览器支持得不好,不像GIF那样受到广泛的支持。
BMP:太大的文件格式格式导致它几乎没有用武之地,现在除了在Windows操作系统中还比较常见之外,几乎看不到它。
(3)javajpeg压缩算法扩展阅读:
图片文件格式有可能会对图片的文件大小进行不同程度的压缩,图片的压缩分为有损压缩和无损压缩两种。
有损压缩。指在压缩文件大小的过程中,损失了一部分图片的信息,也即降低了图片的质量,并且这种损失是不可逆的,不可能从有一个有损压缩过的图片中恢复出全来的图片。常见的有损压缩手段,是按照一定的算法将临近的像素点进行合并。
无损压缩。只在压缩文件大小的过程中,图片的质量没有任何损耗。任何时候都可以从无损压缩过的图片中恢复出原来的信息。
‘肆’ JPEG2000标准的算法具体分为哪几个部分,每一部分都实现什么功能
JPEG2000标准的算法由:核心编码系统、扩展部分、动态JPEG2000、 一致性测试、参考软件、混合图像文件格式、JPSEC:安全JPEG2000、JPIP:互动工具 APIs和协议、JP3D:3维数据和浮点数据、JPWL:无线、ISO 基本媒体文件格式、进入标准JPEG2000编码器 12部分组成(原有13部分,后来一部分被取消)
1、核心编码系统:定义了核心编码且明确了其在标准的其他部分中的使用,还规定了一
种简单的文件格式JP2。
2、扩展部分:扩展了第1部分解码部分的高级特征,包括扩展文件格式支持和采用更复
杂的算法提高压缩效率。
3、动态JPEG2000:它主要以第1部分的附加文件格式技术为基础。编码器明显比MPEG标准简单,主要应用于如快速捕捉模式的数字摄影、视频编辑和数字电影的归档和发行。
4、为保证标准高质量的实现定义
了一致性测试
5、定义两种参考软件来实现第1部分,一种是由TJ2000工作组提供的JAVA工具,另一
种是C工具,称作JASPER。
6、定义了一种混合图像文件格式。
7、JPSEC与JPEG2000安全应用有关。
8、JPIP为分配有关JPEG2000应用定义了一套高级网络协议。
9、JP3D与3维数据和浮点数据压缩有关。
10、JPWL使用JPEG2000处理无线应用。
11、是对第3部分的增补。
12、2004年3月建立,主要是对JPEG2000编码器进行标准化。
我这里有份专门介绍JPEG2000标准的算法的资料,如果你需要,可以留下邮箱我发给你!
‘伍’ 求助java压缩图片存储大小的方法
可以使用Draw这个类,通过改变像素来改变存储大小,实例如下:
(StringsrcFilePath,StringdescFilePath)throwsIOException{
Filefile=null;
BufferedImagesrc=null;
FileOutputStreamout=null;
ImageWriterimgWrier;
ImageWriteParamimgWriteParams;
//指定写图片的方式为jpg
imgWrier=ImageIO.getImageWritersByFormatName("jpg").next();
imgWriteParams=newjavax.imageio.plugins.jpeg.JPEGImageWriteParam(
null);
//要使用压缩,必须指定压缩方式为MODE_EXPLICIT
imgWriteParams.setCompressionMode(imgWriteParams.MODE_EXPLICIT);
//这里指定压缩的程度,参数qality是取值0~1范围内,
imgWriteParams.setCompressionQuality((float)1);
imgWriteParams.setProgressiveMode(imgWriteParams.MODE_DISABLED);
ColorModelcolorModel=ImageIO.read(newFile(srcFilePath)).getColorModel();//ColorModel.getRGBdefault();
//指定压缩时使用的色彩模式
//imgWriteParams.setDestinationType(newjavax.imageio.ImageTypeSpecifier(
//colorModel,colorModel.createCompatibleSampleModel(16,16)));
imgWriteParams.setDestinationType(newjavax.imageio.ImageTypeSpecifier(
colorModel,colorModel.createCompatibleSampleModel(16,16)));
try{
if(isBlank(srcFilePath)){
returnfalse;
}else{
file=newFile(srcFilePath);System.out.println(file.length());
src=ImageIO.read(file);
out=newFileOutputStream(descFilePath);
imgWrier.reset();
//必须先指定out值,才能调用write方法,ImageOutputStream可以通过任何
//OutputStream构造
imgWrier.setOutput(ImageIO.createImageOutputStream(out));
//调用write方法,就可以向输入流写图片
imgWrier.write(null,newIIOImage(src,null,null),
imgWriteParams);
out.flush();
out.close();
}
}catch(Exceptione){
e.printStackTrace();
returnfalse;
}
returntrue;
}
publicstaticbooleanisBlank(Stringstring){
if(string==null||string.length()==0||string.trim().equals("")){
returntrue;
}
returnfalse;
}