它的主要功能就是上傳兩張人像,通過(guò)算法進(jìn)行分析對(duì)比,最后得出一個(gè)相似度的分?jǐn)?shù),以驗(yàn)證你們是天造地設(shè)還是顏值互補(bǔ)。
創(chuàng)新互聯(lián)公司專(zhuān)注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于成都做網(wǎng)站、網(wǎng)站建設(shè)、外貿(mào)營(yíng)銷(xiāo)網(wǎng)站建設(shè)、安達(dá)網(wǎng)絡(luò)推廣、小程序設(shè)計(jì)、安達(dá)網(wǎng)絡(luò)營(yíng)銷(xiāo)、安達(dá)企業(yè)策劃、安達(dá)品牌公關(guān)、搜索引擎seo、人物專(zhuān)訪、企業(yè)宣傳片、企業(yè)代運(yùn)營(yíng)等,從售前售中售后,我們都將竭誠(chéng)為您服務(wù),您的肯定,是我們最大的嘉獎(jiǎng);創(chuàng)新互聯(lián)公司為所有大學(xué)生創(chuàng)業(yè)者提供安達(dá)建站搭建服務(wù),24小時(shí)服務(wù)熱線:18982081108,官方網(wǎng)址:www.cdcxhl.com
但是,當(dāng)我們把上傳的圖片轉(zhuǎn)換成base64格式,發(fā)送給后臺(tái)時(shí),會(huì)發(fā)現(xiàn)偶爾會(huì)出現(xiàn)問(wèn)題,有一些圖片本來(lái)是這樣的:
柴犬
處理之后卻變成了這樣:
柴犬2
經(jīng)過(guò)測(cè)試發(fā)現(xiàn),只有iOS手機(jī)豎著拍的照片才會(huì)出現(xiàn)這樣的問(wèn)題,而iOS手機(jī)橫著拍的照片、Android手機(jī)拍的照片以及通過(guò)屏幕截圖、網(wǎng)絡(luò)下載等途徑獲得的圖片都不會(huì)產(chǎn)生這個(gè)問(wèn)題。
那么,這到底是為什么呢?
在開(kāi)發(fā)過(guò)程中,由于時(shí)間緊迫,未求甚解,使用了github上的一個(gè)開(kāi)源項(xiàng)目 lrz.js 來(lái)解決此問(wèn)題,這個(gè)工具的主要用途是在盡量保證圖片質(zhì)量的前提下壓縮圖片的大小,但同時(shí)也附帶了圖片旋轉(zhuǎn)角度糾正的功能。
通過(guò)閱讀 lrz.js 的源代碼,我發(fā)現(xiàn)它引入了一個(gè)叫做 exif.js 的庫(kù)來(lái)實(shí)現(xiàn)旋轉(zhuǎn)角度的糾正,它提供了js讀取圖像的原始數(shù)據(jù)的功能擴(kuò)展,例如:拍照方向、相機(jī)設(shè)備型號(hào)、拍攝時(shí)間、ISO 感光度、GPS 地理位置等數(shù)據(jù)。而拍照方向就是關(guān)鍵所在!
exif.js 獲取圖像的拍照方向的代碼如下:
EXIF.getData(IMG_FILE, function () { // IMG_FILE為圖像數(shù)據(jù)
var orientation = EXIF.getTag(this, "Orientation");
console.log("Orientation:" + orientation); // 拍照方向
});
獲取拍照方向的結(jié)果為1-8的數(shù)字:
拍照方向信息
注意:對(duì)于上面的八種方向中,加了*的并不常見(jiàn),因?yàn)樗鼈兇淼氖晴R像方向,如果不做任何的處理,不管相機(jī)以任何角度拍攝,都無(wú)法出現(xiàn)鏡像的情況。
這個(gè)表格代表什么意義?我們來(lái)看第一行,值為1時(shí),右邊兩列的值分別為:Row #0 is Top,Column #0 is Left side,其實(shí)很好理解,它表示照片的第一行位于頂端,而第一列位于左側(cè),那么這張照片自然就是以正常角度拍攝的。
而這8種結(jié)果,就是第一行與第一列所在的位置的8種組合。
那么,我們來(lái)測(cè)試一下iOS手機(jī)橫著拍的照片,來(lái)看看它的拍照方向是什么呢?
測(cè)試1
結(jié)果是1,即以正常角度拍攝的,其實(shí)也就是原圖啦~
那么,我們?cè)贉y(cè)試一下iOS手機(jī)豎著拍的照片,來(lái)看看它的拍照方向是什么呢?
測(cè)試2
原來(lái)是6!即第一行位于右側(cè),第一列位于頂端,其實(shí)相當(dāng)于將照片順時(shí)針旋轉(zhuǎn)了90度!
所以,實(shí)際上iOS手機(jī)豎著拍出的照片與橫著拍出的照片其本質(zhì)上是一樣的,只不過(guò)豎著拍出的照片被添加了一個(gè)順時(shí)針旋轉(zhuǎn)90°的拍照方向,所以顯示的時(shí)候,就變成了上下邊窄左右邊寬的狀態(tài),其實(shí)也就是橫著拍的照片順時(shí)針旋轉(zhuǎn)90°而成的~
那么明白了這些,文章開(kāi)頭所說(shuō)的照片旋轉(zhuǎn)bug的原因,也就很簡(jiǎn)單啦~
其實(shí)就是當(dāng)我們?cè)谇岸藢?duì)圖片進(jìn)行像素處理或者drawInRect等操作之后,照片的Orientaion信息,即為拍照方向信息被刪除了,所以iOS手機(jī)豎著拍的照片又回到了橫著的狀態(tài),看起來(lái)也就是逆時(shí)針旋轉(zhuǎn)了90°!
那么如何糾正這個(gè)旋轉(zhuǎn)角度呢?
其實(shí)思路也很簡(jiǎn)單:在處理圖片之前,先讀取并保存圖片的拍照方向信息,然后在處理圖片之后,再根據(jù)拍照方向,對(duì)圖片進(jìn)行相應(yīng)的調(diào)整,lrz.js 中的代碼如下:
switch (orientation) {
case 3:
ctx.rotate(180 * Math.PI / 180);
ctx.drawImage(img, -resize.width, -resize.height, resize.width, resize.height);
break;
case 6:
ctx.rotate(90 * Math.PI / 180);
ctx.drawImage(img, 0, -resize.width, resize.height, resize.width);
break;
case 8:
ctx.rotate(270 * Math.PI / 180);
ctx.drawImage(img, -resize.height, 0, resize.height, resize.width);
break;
case 2:
ctx.translate(resize.width, 0);
ctx.scale(-1, 1);
ctx.drawImage(img, 0, 0, resize.width, resize.height);
break;
case 4:
ctx.translate(resize.width, 0);
ctx.scale(-1, 1);
ctx.rotate(180 * Math.PI / 180);
ctx.drawImage(img, -resize.width, -resize.height, resize.width, resize.height);
break;
case 5:
ctx.translate(resize.width, 0);
ctx.scale(-1, 1);
ctx.rotate(90 * Math.PI / 180);
ctx.drawImage(img, 0, -resize.width, resize.height, resize.width);
break;
case 7:
ctx.translate(resize.width, 0);
ctx.scale(-1, 1);
ctx.rotate(270 * Math.PI / 180);
ctx.drawImage(img, -resize.height, 0, resize.height, resize.width);
break;
default:
ctx.drawImage(img, 0, 0, resize.width,resize.height);
}
其中,translate是平移變換,scale(-1,1)是向左翻轉(zhuǎn),rotate是順時(shí)針旋轉(zhuǎn)。
舉例說(shuō)明 case 2,當(dāng)圖片的拍照方向?yàn)?時(shí),即第一行位于頂端,而第一列位于右側(cè),其實(shí)相當(dāng)于把照片進(jìn)行了左右的翻轉(zhuǎn)。所以,這里對(duì)圖片的操作是,先向右平移等于圖片寬度的距離,再向左翻轉(zhuǎn),這相當(dāng)于以圖片水平方向的對(duì)稱(chēng)軸為軸進(jìn)行了左右翻轉(zhuǎn),然后再以(0,0)為起始點(diǎn)繪制原寬高的圖片,即完成了對(duì)拍照方向的糾正。
最后
經(jīng)過(guò)一系列的測(cè)試,發(fā)現(xiàn)確實(shí)只有iOS手機(jī)的豎拍照片與橫拍照片是通過(guò)拍照方向來(lái)區(qū)別的,Android手機(jī)無(wú)論豎拍還是橫拍的照片,拍照方向都為1,也就是說(shuō)即使丟失了拍照方向這一信息,也不會(huì)影響到圖片的旋轉(zhuǎn)角度。而手機(jī)或電腦的屏幕截圖、網(wǎng)絡(luò)上的圖片、通過(guò)PS制作的圖片等也是如此。
作者:任無(wú)名F
鏈接:
來(lái)源:簡(jiǎn)書(shū)
著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請(qǐng)注明出處。
圖片文件壓縮1M以?xún)?nèi),但是圖片畫(huà)面清晰質(zhì)量不變,可以使用以下操作方法:
1、獲取工具“秒會(huì)壓縮大師”,選擇操作
2、導(dǎo)入圖片進(jìn)行操作。
3、最后等待圖片壓縮完成。
4、說(shuō)明壓縮模式:
縮小優(yōu)先(適合用于個(gè)人資料圖片和縮率圖)
均衡壓縮(適合用于電子郵件和消息發(fā)送)
清晰優(yōu)先(適合查看)
推薦理由:
1.??? 模式壓縮圖片:可根據(jù)需求選擇圖片壓縮模式(如縮小優(yōu)先、清晰優(yōu)先),并支持自定義設(shè)圖片壓縮的清晰度、分辨率、格式以及希望大小。
2.??? .操作簡(jiǎn)單快速:可一次性上傳多張需要壓縮的圖片文件,批量進(jìn)行圖片壓縮處理,支持根據(jù)壓縮前與壓縮后的文件大小對(duì)比確認(rèn)壓縮結(jié)果是否符合預(yù)期效果,節(jié)約圖片壓縮的時(shí)間成本。
3.??? 保障文件安全:圖片壓縮在線版對(duì)壓縮過(guò)程進(jìn)行了多重加密處理,并且在壓縮完圖片文件的30分鐘后,便會(huì)將所有文件從服務(wù)器中永久刪除,期間無(wú)人能查閱或下載這些文件,讓你的文件與隱私得到保障。
支持多種格式:圖片:支持JPG、PNG、GIF、BMP等圖片格式;視頻:支持MP4、MKV、MOV、AVI、WMV、M4V、MPEG等視頻格式;PDF:PDF文檔均可壓縮;Word:支持doc、docx等Word格式;PPT:支持ppt、pptx等PPT格式;
這個(gè)很容易實(shí)現(xiàn)啊,比如用這個(gè)在線圖片壓縮工具,想把圖片文件的大小減到多少都行,直接設(shè)置一下數(shù)值,馬上瞬間就能完成了。在線智能壓縮圖片大小,圖片降低像素,PNG|JPG大圖縮小
▼ 在線一鍵壓縮圖片步驟:
一、首先點(diǎn)擊加號(hào)添加需要壓縮的圖片。目前已知支持對(duì)jpg、png等多種常見(jiàn)的圖片格式進(jìn)行壓縮,如果上傳圖片并壓縮成功,則代表支持該圖片格式。
二、可以自行修改圖片需要被壓縮到的最大寬高尺寸,默認(rèn)為圖片原始的寬高尺寸,且寬高比例是自動(dòng)鎖定的。
三、必須設(shè)置圖片被壓縮后,期望輸出的圖片文件的最大占用空間。(必填項(xiàng))
四、選擇圖片生成的算法。默認(rèn)為混合優(yōu)先算法,絕大多數(shù)情況下使用默認(rèn)算法即可。
五、壓縮的設(shè)定值不能小于1Kb,但圖片壓縮的最終效果可以小于1Kb。
HTML是用來(lái)做網(wǎng)站的一種語(yǔ)言哈,就是在html里面改變圖片的大小就要改變文件代碼,打開(kāi)圖片源代碼,圖片文件的大小是height,和寬,我們可以更改,在語(yǔ)言中我們需要設(shè)置的都是英文的。
現(xiàn)在壓縮工具將圖片縮小之后都會(huì)對(duì)畫(huà)質(zhì)有影響,壓縮圖片文件選擇壓縮工具頁(yè)面中的普通壓縮就可以了壓縮程度不要過(guò)大,找到圖片壓縮工具,圖片要放置在工具頁(yè)面上進(jìn)行數(shù)據(jù)分析,根據(jù)圖片的大小工具會(huì)制定壓縮方案。
圖片分享論壇卻只允許發(fā)幾百KB的文件;微信、分享給朋友的時(shí)候自動(dòng)壓縮的圖像都比較模糊
可以參考chrome小樂(lè)圖客擴(kuò)展的截圖功能,支持粘貼剪貼板圖片、拖拽圖片、或者粘貼圖片網(wǎng)址上傳,是通過(guò)html5 file reader實(shí)現(xiàn)的。