主頁 >  其他 > 當程式員遇到會寫代碼的產品經理......

當程式員遇到會寫代碼的產品經理......

2021-09-20 09:51:32 其他

1、緣起

事情是這樣的,上周我接到了個需求,產品經理想在微信內嵌的H5里,靜默獲取圖片的詳細資訊,比如拍照的時間、地理位置、設備指紋等,
一方面最近活兒太多影響我摸魚,另一方面是這個需求沒辦法完全實作,因為有些圖片資訊就是沒有,又懶得解釋,于是我和產品經理說:

這個需求做不了,

原以為事情到這里就結束了,萬萬沒想到,我遇到了一個會寫代碼的產品經理…

第二天早上,我的直屬技術領導直接找到了我,和我說:

“xxx(產品經理)”把獲取圖片資訊的Demo寫出來了,這個需求可以做,之后就你來吧,

當時我的內心是這樣的:

拿錯了拿錯了:

總之,最后這個需求還是落到我頭上了

所以就有了這篇:獲取圖片的Exif資料

2、正文開始

像這種附帶拍攝時間、GPS地理位置等資訊的圖片格式叫做Exif,英文全稱為 Exchangeable image file format,即可交換影像檔案格式 ,

之前有一陣子傳得沸沸揚揚的微信上傳原圖會泄漏隱私資料的事兒,其實就是這個Exif的鍋,,,實際上這些Exif資料是由拍照設備產生的,并且用戶可以自行修改和洗掉,換句話說,你可以隨便修改Exif資料,比如這樣:

隨便在電腦上找一張圖右鍵,點開詳細資訊,編輯選項資料

當然,微信上傳原圖確實會有風險,因為一不小心你就告訴了別人你是在哪里拍的這張照片,但是這個事不能全賴微信,理論上所有上傳圖片的程式都有泄漏隱私的風險,你可以像上面說的那樣直接改資料,也可以點左下角的洗掉屬性和個人資訊來直接洗掉Exif資料

因為Exif資料是可以偽造和洗掉的,所以理論上只能作為參考,而不能當作確切資訊,

那么,如何獲取Exif資料呢?

github上有個4.1k star的開源專案exif-js:https://github.com/exif-js/exif-js

用起來很絲滑,我寫了個Demo來獲取圖片的Exif資料:

http://jsrun.net/kwTKp/edit

隨便找張手機拍的照片上傳看看:

隱私已打碼

可以看到已經獲取到了圖片的Exif資料,并且通過百度地圖API反查出了具體的地址,

但是對于非設備直接拍照的圖片,或者圖片經過了壓縮處理,比如你從網上直接下載下來的圖片等,可能就拿不到Exif資料,

作為一個有追求的前端,至少不能輸給產品經理我們不僅要知其然,還要知其所以然,

所以,去看看exif-js的原始碼:

一千多行,在下告辭

呵,區區一千多行,話不多說,就是肝,


以下是原始碼分析,

分析比較長,可以不看

直接拉到最后給我點個贊 😃


首先是個匿名自執行函式,這樣寫的好處是能擁有獨立作用域,既避免污染外界代碼,也避免被外界代碼污染,

接著定義并匯出EXIF物件,這樣就可以把EXIT暴露給外部,以便外部獲取并使用EXIF物件,

這里檢查了當前環境的模塊化規范,exportscommonjs的規范,如果當前環境支持exports,則使用exports方式匯出模塊,如果不支持,則將EXIF掛到全域物件下,

EXIF上定義了很多屬性和方法,比如我們demo里用到的getData方法:

// exif-js
EXIF.getData = function(img, callback) {
  // ...省略部分非核心代碼
  
  // 判斷img物件上是否有exifdata屬性值
  if (!imageHasData(img)) {
      // 本地上傳一般是沒有exifdata,需要呼叫getImageData去獲取
      getImageData(img, callback);
  } else {
      // 如果有exifdata屬性值直接回呼
      if (callback) {
          callback.call(img);
      }
  }
})

可以看到入參是img物件和callback回呼函式,如果img物件上有exifdata屬性值,則直接呼叫callback,如果沒有,則需要調一個方法去獲取:getImageData

因為圖片有可能是我們通過src屬性定義的,也有可能是本地上傳的,而src屬性值有可能是base64格式,也可能是blob或http/https等格式,所以getImageData會對不同情況的圖片物件進行處理,最后都處理為ArrayBuffer物件,

ArrayBuffer是一個位元組陣列,用來表示通用的、固定長度的原始二進制資料緩沖區,

ArrayBuffer是一個只能讀不能寫的物件,因此原始碼中使用DataView物件對ArrayBuffer進行寫操作,

上述的幾個物件實際上都是JS提供的處理二進制資料的物件,如果想進一步了解,推薦閱讀這篇文章:《聊聊JS的二進制家族:Blob、ArrayBuffer和Buffer》:https://zhuanlan.zhihu.com/p/97768916

我們繼續看原始碼:

拿到ArrayBuffer物件后,就可以對二進制資料進行決議了,

// 決議圖片的Exif資料
function findEXIFinJPEG(file) {
        var dataView = new DataView(file);

        // 根據檔案頭的前2個位元組判斷是否為圖片檔案
        if ((dataView.getUint8(0) != 0xFF) || (dataView.getUint8(1) != 0xD8)) {
            return false; // not a valid jpeg
        }

        var offset = 2,
            length = file.byteLength,
            marker;

        // 遍歷查找Exif資料資訊串
        while (offset < length) {
            // 這里是將0xFFE1分成兩個位元組判斷,先判斷第一個位元組是否等于0xFF
            if (dataView.getUint8(offset) != 0xFF) {
                return false; // not a valid marker, something is wrong
            }

            marker = dataView.getUint8(offset + 1);
            // we could implement handling for other markers here,
            // but we're only looking for 0xFFE1 for EXIF data

            // 再判斷第二個位元組是否等于0xE1,也就是255
            if (marker == 225) {
                return readEXIFData(dataView, offset + 4, dataView.getUint16(offset + 2) - 2);
            } else {
                offset += 2 + dataView.getUint16(offset+2);
            }

        }

    }

這里有個前置知識點:Exif資訊以0xFFE1作為開頭標記,所以原始碼中的這段while遍歷就是為了找到Exif資訊串的開頭,然后再呼叫readEXIFData方法,

readEXIFData就是對Exif資訊串做決議,即通過遍歷二進制串,匹配出屬性及對應的值,并放到一個物件tags中,決議完成后回傳這個物件,

除了Exif資料,原始碼中還決議了IPTC資料(作者,著作權,字幕,細節描述等)、XMP資料(Extensible Metadata Platform,Adobe公司提出的關于元資料的創建、處理和交換的一套標準),

決議圖片二進制資料得到對應資訊


擴展資料

exif-js的API、屬性等使用說明可以參考這篇博客:http://code.ciaoca.com/javascript/exif-js/


產品經理還有一個獲取設備指紋的需求,因篇幅所限,就下次再寫吧,這里給出Demo:http://jsrun.net/2wTKp/edit,用的是fingerprintjs


3、總結

作為一個禿頭程式員,身處和諧社會,我積極反思了一下自己,實際上不能直接和產品經理說“這個需求做不了”,如果真的做不了,應該給出具體的技術可行性分析,再得出做不了的結論,否則就應該說:“我去看下可行性”,然后去仔細了解下技術實作上的難點,再和產品經理溝通說明,

總而言之就是:

不能直接說“這個需求做不了”

以上都是廢話,大家看看就好,

本文的重點其實還是中間那段獲取Exif資料的分析,

閑扯兩句

中秋快到啦,我的老家最近疫情又嚴重了,所以回不了家,只能中秋的時候一起云賞月云吃餅了~~希望疫情能早日結束吧,

提前祝大家中秋節快樂,團團圓圓,幸福美滿!

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/301448.html

標籤:其他

上一篇:作業系統第一章知識點整理

下一篇:程式員常見單詞縮寫

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more