当前位置: 首页 > 后端技术 > Node.js

【AutoTinyPng】从程序员的角度压缩图片

时间:2023-04-03 13:45:40 Node.js

鍚勪綅浜诧紝鎴戞槸鈥滃墠绔皬鏂板悓瀛︹€濓紝馃槆闀挎湡浠庝簨鍓嶇寮€鍙戯紝Android寮€鍙戯紝鐑》浜庢妧鏈紝鑰屾垜涔熷湪缂栫▼鐨勯亾璺笂瓒婅蛋瓒婅繙~鍓嶈█锛氬鎬殑鏄幇鍦ㄥ緢澶氭妧鏈氦娴佺兢閲岄兘鏈変竴浜涒€滀吉绋嬪簭鍛樷€濓紝姣斿涓嬪浘鐨勫璇濓紝瀹炲湪鏄お楹荤儲浜嗕娇鐢ㄥ湪绾垮浘鐗囧帇缂╃綉绔欏皢鑷繁鐨勫ぇ閲忓浘鐗囪繘琛屽帇缂╁ぇ瀹惰窇杩涚兢閲岄棶鎬庝箞鍔烇紵浠庣▼搴忓憳鐨勮搴︽潵瑙e喅杩欎釜闂锛氬伐浣滀腑鐨勯挀楸兼柟娉曪細涓€鏉′竴鏉℃潵锛屼竴鏉℃潯鍋氥€傚湡璞蔼閲戞柟娉曪細绠€鍗曠紪绋嬮€氳繃缃戠珯寮€鏀続PI杩涜鎵归噺澶勭悊銆傚綋鐒讹紝浣犲鐞嗙殑瓒婂锛屼綘灏辫秺闇€瑕佹敮浠樹竴浜涜垂鐢ㄣ€傛紨绀烘妧鏈柟娉曪細閫傚悎鍦ㄥ悎鐞嗙殑鑼冨洿鍐咃紝闅惧緱鐨勬満浼氬涔犱竴涓嬭嚜宸辩殑缂栫▼鐭ヨ瘑锛岃繕鏄彲浠ュ仛濂芥湰鑱屽伐浣滅殑銆傚叾浠栵細銆?.coding鍓嶇殑鍑嗗锛氫粖澶╃殑demo锛屾垜浠€夋嫨浜嗘紨绀烘妧鏈柟娉曪紝鎴戜篃瑙夊緱杩欐槸绋嬪簭鍛樼殑閫夋嫨锛堜氦缁欑編宸ュ惂銆傘€傘€傦級锛涗竴涓骇鍝佺殑璐ㄩ噺涔熸槸闇€瑕侀€愭笎鎵撶(鍜屼紭鍖栫殑锛宼inypng杩樻槸绋嬪簭鍛樹腑娴佷紶鐨勬瘮杈冨ソ鐢ㄧ殑浜у搧锛屾垜浠繕鏄€夋嫨tinypng锛岀敤鍒汉鐨勪笓涓氬伐鍏峰仛鑷繁鐨勪笢瑗匡紝缇庯紒.鎬濊矾浠嬬粛锛氶€掑綊鑾峰彇鏈湴鏂囦欢澶逛腑鐨勬枃浠惰繃婊ゆ枃浠讹紝鏍煎紡蹇呴』涓?jpg.png锛屼笖澶у皬灏忎簬5MB銆傦紙鏂囦欢澶归€掑綊锛変竴娆″彧澶勭悊涓€涓枃浠讹紙鍙互缁曡繃20涓殑闄愬埗锛夋潵澶勭悊杩斿洖鐨勬暟鎹幏鍙栬繙绋嬩紭鍖栧悗鐨勫浘鐗囧湴鍧€鍙栧洖鍥剧墖鏇存柊鏈湴鍥剧墖绾妭鐐瑰疄鐜帮紝涓嶄緷璧栦换浣曞叾浠栦唬鐮佺墖娈礐oding瀹炵幇锛氫粎閫傜敤浜嶯ode鎻愪緵鐨勬ā鍧楋細constfs=require("fs");const{Console}=require("console");constpath=require("path");consthttps=require("https");constURL=require("url").URL;閫氱敤娴忚鍣ㄦ爣璇嗭紝闃叉鐩稿悓鏍囪瘑琚湇鍔″櫒鎷︽埅锛歝onstUSER_AGENT=["Mozilla/5.0(Macintosh;U;IntelMacOSX10_6_8;en-us)AppleWebKit/534.50(KHTML,likeGecko)Version/5.1Safari/534.50","Mozilla/5.0(Windows;U;WindowsNT6.1;en-us)AppleWebKit/534.50(KHTML,likeGecko)Version/5.1Safari/534.50","Mozilla/5.0(Macintosh;IntelMacOSX10.6;rv,2.0.1)Gecko/20100101Firefox/4.0.1","Mozilla/5.0(WindowsNT6.1;rv,2.0.1)Gecko/20100101Firefox/4.0.1","Opera/9.80(Macintosh;鑻辩壒灏擬acOSX10.6.8锛涗綘;en)Presto/2.8.131Version/11.11","Opera/9.80(WindowsNT6.1;U;en)Presto/2.8.131Version/11.11","Mozilla/5.0(Macintosh;IntelMacOSX10_7_0)AppleWebKit/535.11(KHTML,likeGecko)Chrome/17.0.963.56Safari/535.11","Mozilla/4.0(compatible;MSIE7.0;WindowsNT5.1;360SE)","Mozilla/4.0(compatible;MSIE7.0;WindowsNT5.1);maxthon2.0)","Mozilla/4.0(compatible;MSIE7.0;WindowsNT5.1;Trident/4.0;SE2.XMetaSr1.0;SE2.XMetaSr1.0;.NETCLR2.0.50727;SE2.XMetaSr1.0)",];瀹氫箟鏃ュ織锛屾敮鎸佽緭鍑烘棩蹇楀埌鏂囦欢锛?/瀹氫箟鏃ュ織锛屾敮鎸佽緭鍑烘棩蹇楀埌鏂囦欢classLog{options={flags:"a",//appendmodeencoding:"utf8",//utf8encoding};logger={};/***鍒濆鍖栨墦鍗伴厤缃?/constructor(){this.logger=newConsole({stdout:fs.createWriteStream("./log.tinypng.stdout.log",this.options),stderr:fs.createWriteStream("./log.tinypng.stderr.log",this.options),});}/***鏃ュ織绾у埆*@param{*}娑堟伅杈撳嚭淇℃伅*/log(message){if(message){this.logger.log(message);console.log(message);}}/***閿欒绾у埆*@param{*}message杈撳嚭err淇℃伅*/error(message){if(message){this.logger.error(娑堟伅);鎺у埗鍙般€傞敊璇紙娑堟伅锛夛紱}}}//瀹炰緥鍖朙og瀵硅薄constTlog=鏂版棩蹇楋紙锛夛紱瀹氫箟TinyPng瀵硅薄锛歝lassTinyPng{//閰嶇疆淇℃伅锛氬悗缂€鏍煎紡鍜屾渶澶ф枃浠跺ぇ灏忓彈鎺ユ敹闄愬埗銆備笉鍏佽璋冩暣銆俢onfig={files:[],entryFolder:"./",deepLo鈥嬧€媜p:false,extension:[".jpg",".png"],max:5200000,//5MB==5242848.754299136min:100000,//100KB};//鎴愬姛澶勭悊娆℃暟successCount=0;//澶勭悊澶辫触璁℃暟failCount=0;/***TinyPngconstructor*@param{*}entry鍏ュ彛鏂囦欢*@param{*}deep鏄惁閫掑綊*/constructor(entry,deep){console.log(USER_AGENT[Math.floor(Math.random()*10)]);if(entry!=undefined){this.config.entryFolder=entry;}if(deep!=undefined){this.config.deepLo鈥嬧€媜p=deep;}//杩囨护浼犲叆鐨勫叆鍙g洰褰曚互鍖归厤璋冩暣瑕佸鐞嗙殑鏂囦欢this.fileFilter(this.config.entryFolder);Tlog.log(`鏈鎵ц鑴氭湰鐨勯厤缃細`);Object.keys(this.config).forEach((key)=>{if(key!=="files"){Tlog.log(`Configuration${key}:${this.config[key]}`);}});Tlog.log(`绛夊緟澶勭悊鐨勬枃浠舵暟锛?{this.config.files.length}`);}/***鎵ц鍘嬬缉*/compress(){Tlog.log("姝e湪寮€濮嬪浘鍍忓帇缂╋紝璇风◢鍊?..");璁゛syncAll=[];if(this.config.files.length>0){this.config.files.forEach((img)=>{asyncAll.push(this.fileUpload(img));});Promise.all(asyncAll).then(()=>{Tlog.log(`Processed:Success:${this.successCount}sheets,successrate${this.successCount/this.config.files.length}`);}).catch((error)=>{Tlog.error(error);});}}/***杩囨护寰呭鐞嗘枃浠跺す寰楀埌寰呭鐞嗘枃浠跺垪琛?@param{*}folder寰呭鐞嗘枃浠跺す*@param{*}files寰呭鐞嗘枃浠跺垪琛?/fileFilter(folder){//璇诲彇鏂囦欢澶筬s.readdirSync(folder).forEach((file)=>{letfullFilePath=path.join(folder,file);//璇诲彇鏂囦欢淇℃伅letfileStat=fs.statSync(fullFilePath);//杩囨护鏂囦欢瀹夊叏/澶у皬闄愬埗/鎵╁睍鍚峣f(fileStat.size<=this.config.max&&fileStat.size>=this.config.min&&fileStat.isFile()&&this.config.extension.includes(path.extname(file))){this.config.files.push(fullFilePath);}//娣卞害閫掑綊澶勭悊鏂囦欢澶筫lseif(this.config.deepLo鈥嬧€媜p&&fileStat.isDirectory()){this.fileFilter锛堝畬鏁存枃浠惰矾寰勶級锛泒});}/***杩滅▼鍘嬬缉HTTPS璇锋眰鐨凾inyPng閰嶇疆鐢熸垚鏂规硶*/getAjaxOptions(){return{method:"POST",hostname:"tinypng.com",path:"/web/shrink",headers:{rejectUnauthorized:false,"X-Forwarded-For":Array(4).fill(1).map(()=>parseInt(Math.random()*254+1)).join("."),"閭€掑憳-Token鈥濓細Date.now()锛屸€淐ache-Control鈥濓細鈥渘o-cache鈥濓紝鈥淐ontent-Type鈥濓細鈥渁pplication/x-www-form-urlencoded鈥濓紝鈥淯ser-Agent鈥濓細USER_AGENT[Math.floor(Math.random()*10)],},};}/***TinyPng杩滅▼鍘嬬缉HTTPS璇锋眰*@param{string}寰呭鐞唅mg鏂囦欢*@success{*"input":{"size":887,"type":"image/png"},*"output":{"size":785,"type":"image/png","width":81,"height":81,"ratio":0.885,"url":"https://tinypng.com/web/output/7aztz90nq5p9545zch8gjzqg5ubdatd6"}*}*@error{"error":"Badrequest","message":"Requestisinvalid"}*/fileUpload(imgPath){returnnewPromise((resolve)=>{letreq=https.request(this.getAjaxOptions(),(res)=>{res.on("data",async(buf)=>{letobj=JSON.parse(buf.toString());if(obj.error){Tlog.log(`鍘嬬缉澶辫触锛乗n褰撳墠鏂囦欢锛?{imgPath}\n${obj.message}`);}else{resolve(awaitthis.fileUpdate(imgPath,瀵硅薄));}});});req.write(fs.readFileSync(imgPath),"binary");req.on("error",(e)=>{Tlog.log(`璇锋眰閿欒锛乗n褰撳墠鏂囦欢锛?{imgPath}\n,${e}`);});璇锋眰缁撴潫锛堬級锛泒).catch((error)=>{Tlog.log(error);});}//寰幆璋冪敤姝ゆ柟娉曡姹傚浘鐗囨暟鎹?(res)=>{letbody="";res.setEncoding("binary");res.on("data",(data)=>(body+=data));res.on("end",()=>{fs.writeFile(entryImgPath,body,"binary",(err)=>{if(err){Tlog.log(err);}else{this.successCount++;letmessage=`鍘嬬缉鎴愬姛锛氫紭鍖栨瘮鐜囷細${((1-obj.output.ratio)*100).toFixed(2)}%锛屽師濮嬪ぇ灏忥細${(obj.input.size/1024).toFixed(2)}KB锛屽帇缂╁ぇ灏忥細${(obj.output.size/1024).toFixed(2)}KB锛屾枃浠讹細${entryImgPath}`锛汿log.log(娑堟伅);瑙e喅锛堟秷鎭級锛泒});});});req.on("error",(e)=>{Tlog.log(e);});璇锋眰缁撴潫锛堬級锛泒).catch((error)=>{Tlog.log(error);});}}module.exports=TinyPng;鍏ュ彛鑴氭湰锛?***鐢变簬缃戠粶鍘熷洜鍜岀涓夋柟鎺ュ彛鍙嶅埛绛夋妧鏈檺鍒跺鑷撮儴鍒嗗浘鐗囧鐞嗗け璐?/constTinyPng=require("./tinypng.compress.img");functiongetEntryPath(){璁﹊=process.argv.findIndex((i)=>i==="-p");濡傛灉(process.argv[i+1]){杩斿洖process.argv[i+1];}}newTinyPng(getEntryPath(),true).compress();鎵цdemo锛氭棩蹇楄褰曪細缁撹锛氱▼搴忓憳杩樻槸瑕佺畝鍖栭噸澶嶆€у伐浣滐紝鍑犲勾鍓嶉潬鐫€杩欎釜鑴氭湰锛?50M澶氱殑鍓嶇椤圭洰缂╁噺鍒?0~30M銆備綘浼氭兂杩欐牱鐨勯」鐩€庝箞杩樿兘瀛樺湪銆備綘鐨勯」鐩緢澶у悧锛熻€佸疄璇达紝杩欐槸涓嶈鑼冮€犳垚鐨勩€傚骞寸Н绱殑鏂囦欢锛屼綘瑙夊緱涓€涓竴涓鐞嗛潬璋卞悧锛熶綘鍒氬垰瀹屾垚鍘嬬缉锛屽叾浠栧悓浜嬫彁鍑烘彁浜や竴鍫嗗ぇ鍥炬€庝箞鍔烇紝閭f渶濂芥敼鑴氭湰锛屽湪缂栬瘧鐨勬椂鍊欏姞鍏ユ彃浠讹紝瀹岀編锛佹杩庡叧娉ㄦ垜鐨勫叕浼楀彿鈥滃墠绔皬鏂板悓瀛︹€濓紝鍘熷垱鎶€鏈枃绔犵涓€鏃堕棿鎺ㄩ€?/p>