❶ java直接压缩bufferedimage黑色像素斑点问题。求大神解决。
压缩太厉害了吧,75试试
❷ 图片压缩的原理是什么
图像压缩的基本原理
图像数据之所以能被压缩,就是因为数据中存在着冗余。图像数据的冗余主要表现为:图像中相邻像素间的相关性引起的空间冗余;图像序列中不同帧之间存在相关性引起的时间冗余;不同彩色平面或频谱带的相关性引起的频谱冗余。数据压缩的目的就是通过去除这些数据冗余来减少表示数据所需的比特数。由于图像数据量的庞大,在存储、传输、处理时非常困难,因此图像数据的压缩就显得非常重要。
信息时代带来了“信息爆炸”,使数据量大增,因此,无论传输或存储都需要对数据进行有效的压缩。在遥感技术中,各种航天探测器采用压缩编码技术,将获取的巨大信息送回地面。
图像压缩是数据压缩技术在数字图像上的应用,它的目的是减少图像数据中的冗余信息从而用更加高效的格式存储和传输数据。
❸ 求助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;
}
❹ java上传图片 生成缩略图,如果上传的图片尺寸比较小就压缩处理
//将图按比例缩小。
public static BufferedImage resize(BufferedImage source, int targetW, int targetH) {
// targetW,targetH分别表示目标长和宽
int type = source.getType();
BufferedImage target = null;
double sx = (double) targetW / source.getWidth();
double sy = (double) targetH / source.getHeight();
//这里想实现在targetW,targetH范围内实现等比缩放。如果不需要等比缩放
//则将下面的if else语句注释即可
if(sx>sy)
{
sx = sy;
targetW = (int)(sx * source.getWidth());
}else{
sy = sx;
targetH = (int)(sy * source.getHeight());
}
if (type == BufferedImage.TYPE_CUSTOM) { //handmade
ColorModel cm = source.getColorModel();
WritableRaster raster = cm.(targetW, targetH);
boolean alphaPremultiplied = cm.isAlphaPremultiplied();
target = new BufferedImage(cm, raster, alphaPremultiplied, null);
} else
target = new BufferedImage(targetW, targetH, type);
Graphics2D g = target.createGraphics();
//smoother than exlax:
g.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY );
g.drawRenderedImage(source, AffineTransform.getScaleInstance(sx, sy));
g.dispose();
return target;
}
public static void saveImageAsJpg (String fromFileStr,String saveToFileStr,int width,int hight)
throws Exception {
BufferedImage srcImage;
// String ex = fromFileStr.substring(fromFileStr.indexOf("."),fromFileStr.length());
String imgType = "JPEG";
if (fromFileStr.toLowerCase().endsWith(".png")) {
imgType = "PNG";
}
// System.out.println(ex);
File saveFile=new File(saveToFileStr);
File fromFile=new File(fromFileStr);
srcImage = ImageIO.read(fromFile);
if(width > 0 || hight > 0)
{
srcImage = resize(srcImage, width, hight);
}
ImageIO.write(srcImage, imgType, saveFile);
}
public static void main (String argv[]) {
try{
//参数1(from),参数2(to),参数3(宽),参数4(高)
saveImageAsJpg("C:\\Documents and Settings\\xugang\\桌面\\tmr-06.jpg",
"C:\\Documents and Settings\\xugang\\桌面\\2.jpg",
120,120);
} catch(Exception e){
e.printStackTrace();
}
}
❺ Java压缩图片ImageIO.read()报错
BufferedImage sourceImg =ImageIO.read(new FileInputStream(new File(toPath)));
或者
BufferedImage sourceImg =ImageIO.read(new File(toPath));
❻ js锲剧墖铡嬬缉鍒版寚瀹氩ぇ灏忎笉鍙-java濡备綍瀹炵幇鎶娄竴涓澶у浘鐗囧帇缂╁埌鎸囧畾澶у皬镄勫浘鐗囦笖闀垮芥瘆涓嶅彉锛
js铡嬬缉锲剧墖鍒板浐瀹氩儚绱犱互鍐咃纴500k涓轰緥链鏂囨棬鍦ㄦ帰绌秊s铡嬬缉锲剧墖镄勪袱绉嶆柟寮:
鏀瑰彉锲剧墖闀垮
,
鏀瑰彉锲剧墖璐ㄩ噺
,鍜岀粨钖堜简浠ヤ笂涓よ呯殑
链缁堟柟妗
銆
棣栧厛,阒呰绘湰鏂囬渶瑕佺煡阆揷anvas镄勪袱涓鏂规硶
杩欎袱涓鏂规硶鍏蜂綋镄勮存槑鍙浠ュ湪MDN涓婃煡鐪,鍏充簬锲剧墖铡嬬缉,涔熸湁寰埚氱幇鎴愮殑鍗氩㈠彲浠ョ洿鎺ョ敤銆备絾鏄闾d簺鍗氩㈤兘链変釜闂棰,骞舵病链夊叧蹇冧箣钖庡浘鐗囩殑铡嬬缉璐ㄩ噺銆
鎴戣瘯镌鐢ㄤ竴涓鐜版垚镄勪緥瀛愬幓璺戜简涓涓,涓涓1.7M镄勫浘鐗囧帇缂╁埌浜23k,鍫绉板儚绱犵骇姣佺伃镐х牬鍧忋
锅囧备竴寮犲ぇ锲惧彲鑳藉寘钖镌寰埚氭枃瀛楃瓑鍏抽敭淇℃伅,蹇呴’涓娄紶涔嫔悗浣跨敤鏂硅兘娓呮榈杈ㄨゃ傛墍浠ヨ佸帇缂╀箣钖庤川閲忓敖鍙鑳芥帴杩500k镄勚500k镀忕礌浠ュ唴,灏辨槸鑻ヤ竴寮犲浘瀹藉害涓1024,鍒欓珮搴︿笉鑳借秴杩500銆傚洜涓哄浘鐗囨湁鍏朵粬镄勪俊鎭,涔熸槸瑕佸崰澶у皬镄勚傚嵆涓嶅缑澶т簬
1024*500
銆
镓浠,镙规嵁闇姹,涓娄紶锲剧墖涓嶈兘瓒呰繃500k镄勬儏鍐典笅灏藉彲鑳戒缭鐣椤浘鐗囩殑娓呮榈搴︺傚綋铹跺傛灉鍙浠ョ殑𨱍呭喌涓嬬敤涓婇溃鎻愬埌镄勮剧疆铡嬬缉绋嫔害涓0.9,0.8璇曡瘯鐪,锲剧墖璐ㄩ噺鍙浠ユ帴鍙,澶у皬浼氭湁澶у箙搴︾殑缂╁皬銆
濡傛灉涓嶅帇缂,闱犺皟鏁村浘鐗囬暱瀹藉幓鎺у埗涓娄紶澶у皬锻?
铡熺悊寰堢亩鍗,灏辨槸闱犱笉鏂鍦扮缉灏忛檺瀹氱殑链澶у介珮,鐩村埌链缁堥暱瀹界殑绉灏忎簬瑙勫畾镄勫ぇ灏忋
杩欑嶆柟娉曟湁鍙鑳芥渶钖庡缑鍑虹殑锲剧墖镄勫ぇ灏忎细鐣ュぇ浜庤勫畾澶у皬,铡熷洜涓婃枃涔熸彁鍒拌繃浜,濡傛灉𨱍充娇鐢ㄨ繖绉嶆柟娉,鍙镊琛屽啀璋冩暣涓涓嬨
涓婇溃镄勬柟娉曟湁涓闂棰,灏辨槸鏀瑰彉浜嗗浘鐗囩殑铡熷嬮暱瀹姐傚傛灉涓涓锲剧殑闀垮借冻澶熷ぇ,铡嬬缉锲剧墖璐ㄩ噺,绯娄竴镣逛絾鏄鍐呭圭湅寰楁竻涔熸槸ok镄勫槢銆傛墍浠,璺熶笂闱㈠悓鐞,鎴戜滑鍙浠ヤ笉鏂璋冩暣锲剧墖镄勮川閲忚惧畾鐩村埌澶у皬钖堥,闾d箞,濡备綍鍦ㄥ浘鐗囦笂浼犱箣鍓岖煡阆揿浘鐗囩殑澶у皬锻?
棣栧厛,闇瑕佺煡阆撶殑涓镣规槸,铡嬬缉涔嫔悗𨰾垮埌镄刡ase64瀛楃︿覆浼氲浆鎴恇lob瀵硅薄,铹跺悗浼犵粰链嶅姟绔銆
鍙浠ユ煡阒呮枃妗,blob瀵硅薄链変釜灞炴ф槸size
杩欎釜size灏辨槸涓娄紶涔嫔悗瀹为檯镄勬枃浠跺ぇ灏忋
鍙傜収涓婇溃镄勬濊矾,鍙浠ユ疮娆℃敼鍙('image/'+fileType,level);level镄勫,铡昏皟鏁村帇缂╁浘鐗囱川閲,铹跺悗鐢╞lob瀵硅薄镄剆ize铡婚獙璇佹槸钖︽弧瓒500k浠ュ唴镄勯渶姹伞
鍏充簬镄刲evel鍒板簳鏄镐庝箞璁$畻镄,MDN鏂囨。閲屼篃娌¤,鍐欎简涓寰鐜涓娆″噺灏0.1镄刲evel铡嬬缉浜嗗嚑涓锲剧墖
鐢ㄥ姞鍑忎箻闄ょ畻浜嗕竴涓,娌℃垒鍒拌勫緥,鏁板︿笉濂芥斁寮冧简(杩欎釜涓滆タ濂藉儚涔熶笉鏄鑳借傚疗鍑烘潵镄,鐪嬬粨鏋滆窡鍒濆嫔ぇ灏忔病鍟ュ叧绯)銆
杩欓噷瑕佹敞镒忕殑鏄,链夊彲鑳介亣鍒拌秴澶у浘鐗,0.1镄刲evel鍙鑳戒笉瓒充互铡嬬缉鍒500k,镓浠ュ皬浜0.1镄勬椂鍊,鏀瑰彉level阃掑噺镄勫樊鍊肩户缁铡嬬缉涓嫔幓
鍦ㄥ紑濮嬫帴鏀跺埌锲剧墖镄勬椂鍊欑粰涓涓猯oading澧炲姞鐢ㄦ埛镄勮愬绩濂戒简,loading涓囧瞾~
鍏跺疄鍗旷函镄勫帇缂╄川閲忛亣鍒扮◢澶х殑锲剧墖,浼氩艰嚧椤甸溃楂橀戣$畻,铹跺悗椤甸溃锘烘湰灏辩敤涓崭简浜--銆傛湁灏濊瘯杩囩敤iphone镄勪竴涓灞忓箷鎴锲(10M宸﹀彸),铡嬬殑镞跺欑◢杩囦竴浼,鏁翠釜镓嬫満閮藉湪鍙戠俪,鍙鑳芥潃杩涚▼銆
镓浠,鑻ュ归暱搴︽病链夌壒娈婄殑闄愬埗,鍙浠ュ仛涓涓缂╂斁,铡诲姞蹇铡嬬缉镄勮繘搴,鎻愰珮鑳藉帇缂╃殑锲剧墖澶у皬涓婇檺銆
椤甸溃鍒颁简ios涓婅缮鏄涓嶈--,鍙浠ョ湅鍒版渶钖庡浘鐗噇evel涓0.001,链闀胯竟涓764銆
闂棰樿缮鏄寰鐜娆℃暟杩樻槸杩囧,璁$畻棰戠巼澶楂樸备粠锲句腑鍙鐪嫔嚭,瀵逛簬澶у浘𨱒ヨ,鍒濆嬭惧畾镄刲evel鍜屽浘鐗囧昂瀵歌繃浜庡芥涧,鍙浠ヤ紭鍖栦竴涓嫔埯濮媗evel鍜屽昂瀵搞
链夌殑镞跺栾缮浼氶亣鍒颁竴寮犲浘鐗囨棤璁哄备綍涔熷帇涓嶅埌500k,灏辨槸涓娄竴娆″拰杩欐$殑铡嬬缉钖庡ぇ灏忔病链夊彉鍖,杩欑嶆儏鍐甸渶瑕佹姏阌,涓嶈╁惊鐜缁х画銆
澶у浘鐗囩殑绛夊緟镞堕棿绋嶉暱,鍙浠ョ粰鐢ㄦ埛鍏堥勮堜竴涓狰ase64镄勫浘鐗囧炲姞绛夊緟钥愬绩,鏂规硶钖崭负getImgBase64,杩欓噷閮戒竴骞剁粰鍑轰简
瑙e喅镄勯殣鎭:涓婇溃杩欎釜鏂规堜细鍑虹幇鎴戦渶瑕佷竴涓500k镄勭収鐗,铡嫔埌浜520k涔嫔悗,鍐嶅帇浜嗕竴娆°傛湁镞跺栾繖链钖庣殑涓娆′细鐗瑰埆澶稿紶,鐩存帴灏嗗浘鐗囧纰鍒颁简鍑犲崄k銆
鍙傝冧简:
杩欎釜搴挞噷闱㈡湁涓鏂规硶compressAccurately,杩欎釜鏂规硶鍙浠ユ瘆杈幂簿鍑嗗湴铡嬬缉銆傚伔锅风炕浜嗕竴涓嬫簮镰併
鍏跺疄涓娄竴涓鏂规堢殑䦅涚偣灏卞湪浜,濡备綍鍦ㄦ疮涓涓铡嬬缉寰鐜閲屽勭悊灏哄稿拰铡嬬缉姣斾緥銆
镐荤粨
濡傛湁绾版纺,娆㈣繋鎸囨
java濡备綍瀹炵幇鎶娄竴涓澶у浘鐗囧帇缂╁埌鎸囧畾澶у皬镄勫浘鐗囦笖闀垮芥瘆涓嶅彉锛java瑕佸疄鐜版妸涓涓澶у浘鐗囧帇缂╁埌鎸囧畾澶у皬镄勫浘鐗囦笖闀垮芥瘆涓嶅彉鍙浠ュ皾璇曚互涓嬫搷浣:
寤虹珛涓涓狝ffineTransform
AffineTransform(doublem00,doublem10,doublem01,doublem11,doublem02,doublem12)
杞鎹㈢烦阒,缂╂斁姣旇缉绠鍗(鐭╅樀鍙浠ュ共寰埚氢簨𨱍,𨱍冲仛锲惧儚澶勭悊杞浠跺彲浠ョ爷绌朵笅)
[x'][m00m01m02][x][m00x+m01y+m02]
[y']=[m10m11m12][y]=[m10x+m11y+m12]
[1][001][1][1]
10鍊嶆瘆杈冮毦绠(镙瑰彿10鍟,褰撶劧浣犳兂绠椾篃琛),9鍊嶅ソ镣(9镄勫紑鏂规槸3),m00涓1/3,m01涓0,m02涓0,m10涓0,m11涓1/3,m12涓0銆
鍐嶅缓涓涓狝ffineTransformOp,鎶娄笂闱㈢殑杞鎹浼犺繘铡
AffineTransformOp(AffineTransformxform,intinterpolationType)
链钖庤皟鐢ˋffineTransformOp镄凚ufferedImagefilter(BufferedImagesrc,BufferedImagedst),src浼犲师锲剧墖,杩斿洖鍊煎氨鏄𨱍宠佺殑Image,娉ㄦ剰鏄杩斿洖鍊,涓嶆槸dst,涓嶆槑锏藉彲浠ョ湅涓婮avaAPI
java濡备綍瀹炵幇鎶娄竴涓澶у浘鐗囧帇缂╁埌鎸囧畾澶у皬镄勫浘鐗囦笖闀垮芥瘆涓嶅彉锛java瑕佸疄鐜版妸涓涓澶у浘鐗囧帇缂╁埌鎸囧畾澶у皬镄勫浘鐗囦笖闀垮芥瘆涓嶅彉鍙浠ュ皾璇曚互涓嬫搷浣:
寤虹珛涓涓狝ffineTransform
AffineTransform(doublem00,doublem10,doublem01,doublem11,doublem02,doublem12)
杞鎹㈢烦阒,缂╂斁姣旇缉绠鍗(鐭╅樀鍙浠ュ共寰埚氢簨𨱍,𨱍冲仛锲惧儚澶勭悊杞浠跺彲浠ョ爷绌朵笅)
[x'][m00m01m02][x][m00x+m01y+m02]
[y']=[m10m11m12][y]=[m10x+m11y+m12]
[1][001][1][1]
10鍊嶆瘆杈冮毦绠(镙瑰彿10鍟,褰撶劧浣犳兂绠椾篃琛),9鍊嶅ソ镣(9镄勫紑鏂规槸3),m00涓1/3,m01涓0,m02涓0,m10涓0,m11涓1/3,m12涓0銆
鍐嶅缓涓涓狝ffineTransformOp,鎶娄笂闱㈢殑杞鎹浼犺繘铡
AffineTransformOp(AffineTransformxform,intinterpolationType)
链钖庤皟鐢ˋffineTransformOp镄凚ufferedImagefilter(BufferedImagesrc,BufferedImagedst),src浼犲师锲剧墖,杩斿洖鍊煎氨鏄𨱍宠佺殑Image,娉ㄦ剰鏄杩斿洖鍊,涓嶆槸dst,涓嶆槑锏藉彲浠ョ湅涓婮avaAPI
❼ java实现图片预览功能,可以显示缩列图,具有上下页的功能求技术支持
把图片按照规定的比例压缩,然后保存至FTP,列表读取缩略图,单击显示原图。
/**
*压缩图片方法一(高质量)
*@paramoldFile将要压缩的图片
*@paramwidth压缩宽
*@paramheight压缩高
*@paramsmallIcon压缩图片后,添加的扩展名(在图片后缀名前添加)
*@paramquality压缩质量范围:<i>0.0-1.0</i>高质量:<i>0.75</i>中等质量:<i>0.5</i>低质量:<i>0.25</i>
*@parampercentage是否等比压缩若true宽高比率将将自动调整
*/
publicstaticvoidcompressImage(StringoldFile,intwidth,intheight,StringsmallIcon,
floatquality,booleanpercentage){
try{
Filefile=newFile(oldFile);
//验证文件是否存在
if(!file.exists())
thrownewFileNotFoundException("找不到原图片!");
//获取图片信息
BufferedImageimage=ImageIO.read(file);
intorginalWidth=image.getWidth();
intorginalHeight=image.getHeight();
//验证压缩图片信息
if(width<=0||height<=0||!Pattern.matches("^[1-9]\d*$",String.valueOf(width))
||!Pattern.matches("^[1-9]\d*$",String.valueOf(height)))
thrownewException("图片压缩后的高宽有误!");
//等比压缩
if(percentage){
doublerate1=((double)orginalWidth)/(double)width+0.1;
doublerate2=((double)orginalHeight)/(double)height+0.1;
doublerate=rate1>rate2?rate1:rate2;
width=(int)(((double)orginalWidth)/rate);
height=(int)(((double)orginalHeight)/rate);
}
//压缩后的文件名
StringfilePrex=oldFile.substring(0,oldFile.lastIndexOf('.'));
StringnewImage=filePrex+smallIcon+oldFile.substring(filePrex.length());
//压缩文件存放位置
FilesavedFile=newFile(newImage);
//创建一个新的文件
savedFile.createNewFile();
//创建原图像的缩放版本
Imageimage2=image.getScaledInstance(width,height,Image.SCALE_AREA_AVERAGING);
//创建数据缓冲区图像
BufferedImagebufImage=newBufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
//创建一个Graphics2D
Graphics2Dg2=bufImage.createGraphics();
//重绘图像
g2.drawImage(image2,0,0,width,height,null);
g2.dispose();
//过滤像素矩阵
float[]kernelData={
-0.125f,-0.125f,-0.125f,
-0.125f,2,-0.125f,-0.125f,
-0.125f,-0.125f};
Kernelkernel=newKernel(3,3,kernelData);
//按核数学源图像边缘的像素复制为目标中相应的像素输出像素
ConvolveOpcOp=newConvolveOp(kernel,ConvolveOp.EDGE_NO_OP,null);
//转换像素
bufImage=cOp.filter(bufImage,null);
FileOutputStreamout=newFileOutputStream(savedFile);
JPEGImageEncoderencoder=JPEGCodec.createJPEGEncoder(out);
JPEGEncodeParamparam=encoder.getDefaultJPEGEncodeParam(bufImage);
//设置压缩质量
param.setQuality(quality,true);
encoder.encode(bufImage,param);
out.close();
System.out.println(newImage);
}catch(Exceptione){
e.printStackTrace();
System.out.println("压缩失败!"+e.getMessage());
}
}