手機螢幕置換 是做什麼的?
照片:$ARGUMENTS。如果沒有,請要求一張,或使用 find_photos.py 尋找。
手機的整個正面由程式碼替換:螢幕、黑色邊框以及瀏海或動態島。玻璃以外的照片部分保持不變。
對於已存在的模板,不需要此技能:python3 swap.py <image>。
新模板
使用:一張真實的 iPhone 照片,鏡頭對準螢幕。跳過:Android、傾斜超過 25°、一邊長度超過另一邊 1.2 倍(裁切會拒絕它們)。跳過手指或袖子遮住螢幕的照片: 因為沒有灰色邊框,會被塗滿。所有玻璃區域(包括反光)都是我們的。只有從照片外部進入的皮膚會保留下來。
P=<名稱,8 個字元,唯一>;D=templates/corners
mkdir -p out
# 1. 查看照片並讀取螢幕的大致邊角,TL、TR、BR、BL
python3 tools/slide_crop.py --q '<邊角>' <photo.jpg> templates/crop/$P.jpg # 在裁切上印出邊角
# 2. 精確的直邊。如果 `live` 較低:R=34
python3 tools/slide_lines.py $P '<裁切上的邊角>' out/l.jpg # 在輸出結尾處有精煉的邊角
# 3. 輪廓:透視、鏡頭彎曲、半徑、玻璃輪廓
python3 tools/slide_trace.py $P '<邊角>' out/t.jpg $D/$P.json
# 4. 驗證未見過的貼合部分。務必查看圖片
python3 tools/slide_proof.py $P $D/$P.json out/$P-proof.jpg
# 5. 姿態,僅用於反射
python3 tools/slide_sheet.py $P $D/$P.pose.json init
# 6. 測量瀏海或動態島、狀態圖示、黑色區域
python3 tools/slide_check.py $P measure
# Recipe $D/$P.recipe.json:複製 a841f108(瀏海)或 f5dad639(動態島),然後設定 frame=$P、pose、corners 和測量到的選項
# 7. 將時間和圖示放置到這支手機的位置
python3 tools/slide_status.py $P init <從 measure 得到的行>;python3 tools/slide_status.py $P build
# 8. 建置和紅色測試
python3 tools/slide_check.py $P build
# 9. 洩漏熱圖
python3 tools/slide_check.py $P leak
# 10. 邊框寬度
python3 tools/slide_check.py $P frame
之後它就會變成一個模板:python3 swap.py <image> -t $P。
相信它之前先檢查
out/$P-split.jpg: 照片、紅色、結果。紅色貼合,邊框終止於機殼,從機身向內的所有部分都是我們的。out/$P-leak.jpg: 黑色螢幕上的邊框,亮度以對數尺度顯示。任何發亮的東西都來自照片:切割處周圍的線條、斑點、反光。只有揚聲器和真正位於前方的物體可能會顯示。out/$P-top.jpg: 照片上切割處的綠色輪廓,圖示就定位。out/$P-zoom.jpg: 邊角和邊框,放大,與照片並列。- 透過
swap.py使用白色圖像的模板:深色頁面會隱藏不良的邊角和邊緣。 out/$P-frame.jpg: 白色螢幕上的四個邊角。在下方邊框檢查通過之前,模板不算完成。
邊框檢查
黑色邊框是硬體,四周寬度一致。slide_check.py $P frame 在白色螢幕上建置,將其拉直,並測量每邊中間的黑色,單位為螢幕畫素(寬 591)。它會印出每邊的 ours 和 photo、差值以及判定:最多 4 px 為 OK,更多則為 FIX。
4 px 的限制是根據這些手機得出的:7.5 px 的差值很明顯,而 4 px 則不明顯。
如果新模板顯示 FIX:
- 再次執行
slide_trace.py:它會讀取可見的黑色並為每邊提供中位數(frame:行)。 - 重建,然後再次執行
frame。 - 仍然是
FIX:比較ours和photo。如果它們相符,則表示該邊的反光、機殼或手在照片中隱藏了邊框。如果不相符,則輪廓有誤:查看-frame.jpg和-split.jpg。 - 如果無法收斂,則不要將模板標記為完成。說明哪一邊有問題,以及偏離了多少 px。
同時目視檢查
-frame.jpg:頂部和側邊應相符。 出貨的模板:f38fe44a2.2、791866583.2 和895d3ee83.8 通過。f5dad6395.8、a841f1086.2 和14278a0b8.5 未通過:它們的邊框保持最初建置的樣子。
設定
- 黑色:
floor,使邊框和切割處與照片相符。從.003開始,如果照片較暗則調低。build會印出兩者。 - 瀏海: 來自
measure的值。根據綠色輪廓調整cr,measure讀取的值偏低。 - 瀏海上方的揚聲器:
grille=45。如果舊頁面的細線出現在瀏海周圍:gband=1。 - 動態島: 其中心是硬體,位於 591 中的 295.5。如果
measure顯示偏差超過 1 px,則表示某個明亮的東西吃掉了一邊:取乾淨的一邊,並透過中心鏡像。在鎖定畫面上,從有動態島的手機取得x(時間 111,圖示 479)和從measure取得y。 - 動態島上方的揚聲器: 如果它位於玻璃輪廓內部,
grille=45只會恢復其浮雕效果。 - 袖子遮住玻璃:
sleeve=1,僅在templates/grey/中有真實灰色邊框時使用(f38fe44a)。 - 暗對暗: 當 720 個點中少於 400 個點上升時,
slide_trace.py會自動切換。請格外小心地檢查-split。
運作原理
手機是剛性的,因此螢幕是一個帶有 iOS 連續圓角的矩形,透過透視和一個徑向鏡頭彎曲觀察。邊緣以對數亮度找到,因此暗對暗也能運作,並放在線性光線的中點。圖片繪製在拉直的照片上,然後隨著玻璃彎曲回來。
已知陷阱
- 僅根據深色頁面進行判斷。
- 用一種方式貼合卻用另一種方式檢查:檢查是貼合,驗證是剩餘的部分。
- 直接在照片上畫直線:照片是彎曲的。它們只存在於拉直的照片上。
- 在明亮螢幕上從外向內搜尋機殼邊緣:一塊布折疊起來看起來像機殼。從螢幕向外搜尋。