JS 骨骼動畫 (DragonBones) 在 iOS 端截屏功能

需求背景:

使用 DragonBones 在 Webview 中繪制骨骼動畫,并對當(dāng)前的骨骼頁面進(jìn)行圖層截取,實(shí)現(xiàn)保存本地和分享功能搀绣。

問題:

使用 DragonBones 制作骨骼動畫時(shí)遇到一個(gè)問題肝集,使用 WKWebView 加載骨骼動畫正常,再對 WKWebView 的父容器 view (控制器 view )進(jìn)行截圖是出現(xiàn)空白暮蹂。

解決思路及方案一:

通過資料查閱,發(fā)現(xiàn) WKWebView 在截圖時(shí)比較特殊,需要調(diào)用 UIView 的分類齐邦,也就是

- (nullable UIView *)snapshotViewAfterScreenUpdates:(BOOL)afterUpdates NS_AVAILABLE_IOS(7_0);

進(jìn)行View圖層的快照獲取椎侠,推測和 WKWebView 的渲染原理相關(guān)。因?yàn)檎A鞒潭际峭ㄟ^ UIGraphics 去捕捉 UIView 的上下文來生成 UIImage 對象措拇,進(jìn)而分享或保存到本地我纪。

+ (UIImage *)getSharingImageWithView:(UIView *)originView {
    UIImage *snapshotImage = nil;
    UIGraphicsBeginImageContextWithOptions(originView.bounds.size, NO, [UIScreen mainScreen].scale);
    [originView.layer renderInContext:UIGraphicsGetCurrentContext()];
    snapshotImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return snapshotImage;
}

對 WkWebView、TableView 等滾動視圖循環(huán)截屏可參考 TYSnapshotScroll丐吓。
當(dāng)然浅悉,例如 TYSnapshotScroll 提供的 WKWebView 截圖方式(snapshotViewAfterScreenUpdates)截取方式對類似 github、google 等首頁的截取非常完美券犁。

但是术健,在加載骨骼動畫時(shí)只有動畫背景,沒有任務(wù)形象粘衬。

解決思路及方案二:

根據(jù)從安卓和前端收集的信息來看:

  1. h5 骨骼動畫底層使用了 canvas 繪圖(一個(gè)類似于 iOS CoreGraphic 的庫荞估,專門負(fù)責(zé)繪制復(fù)雜圖形咳促。)
  2. JavaScript 使用 canvas 繪圖時(shí),會存在這樣的關(guān)系勘伺,直接上圖
canvas 的七大姑八大姨
  1. 上圖中最有價(jià)值的線索是跪腹,canvas 會調(diào)用 webGL 進(jìn)行渲染,同時(shí)會調(diào)用硬件加速功能
  2. 安卓端在手動關(guān)閉硬件加速后飞醉,該頁面截屏恢復(fù)正常冲茸。

然鵝,只有 Safari 中有對 WebGL 有控制權(quán)缅帘,WKWebView 并不能通過代碼關(guān)閉硬件加速轴术。
所以只能放棄使用 canvas 動態(tài)繪制的 webView 進(jìn)行圖像提取。

所以钦无,我們采取了采取了雙端結(jié)合的思路:

  • 由 JavaScript 通過 canvas 輸出 base64 圖片字符串逗栽,以及人物背景圖片的URL
    JavaScript生成圖片:
var fullQuality = canvas.toDataURL('image/jpeg', 1.0); // 參數(shù)二控制圖片質(zhì)量
// data:image/jpeg;base64,/9j/4AAQSkZJRgABAQ...9oADAMBAAIRAxEAPwD/AD/6AP/Z"
var mediumQuality = canvas.toDataURL('image/jpeg', 0.5);
var lowQuality = canvas.toDataURL('image/jpeg', 0.1);

Native 解析圖片:

NSData *decodedImageData = [NSData dataWithContentsOfURL:[NSURL URLWithString:base64String]];
UIImage *decodedImage = [UIImage imageWithData:decodedImageData
                                         scale:[UIScreen mainScreen].scale];
personImageView.image = decodedImage;
  • 由 Native 對使用這些資源進(jìn)行布局渲染,并且控制截屏?xí)r用戶信息铃诬、二維碼等元素的展示祭陷,效果如圖:
骨骼動畫截屏

總結(jié)

對于部分特殊控件的圖像處理可能要會出現(xiàn)位置的異常,需要對對應(yīng)的底層實(shí)現(xiàn)技術(shù)點(diǎn)進(jìn)行剖析趣席,倒推引起的原因。

參考:

HTML5 Canvas,WebGL,CSS Shaders,GLSL的曖昧關(guān)系
egret
dragonBone

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末醇蝴,一起剝皮案震驚了整個(gè)濱河市宣肚,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌悠栓,老刑警劉巖霉涨,帶你破解...
    沈念sama閱讀 211,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異惭适,居然都是意外死亡笙瑟,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,347評論 3 385
  • 文/潘曉璐 我一進(jìn)店門癞志,熙熙樓的掌柜王于貴愁眉苦臉地迎上來往枷,“玉大人,你說我怎么就攤上這事凄杯〈斫啵” “怎么了?”我有些...
    開封第一講書人閱讀 157,435評論 0 348
  • 文/不壞的土叔 我叫張陵戒突,是天一觀的道長屯碴。 經(jīng)常有香客問我,道長膊存,這世上最難降的妖魔是什么导而? 我笑而不...
    開封第一講書人閱讀 56,509評論 1 284
  • 正文 為了忘掉前任忱叭,我火速辦了婚禮,結(jié)果婚禮上今艺,老公的妹妹穿的比我還像新娘窑多。我一直安慰自己,他們只是感情好洼滚,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,611評論 6 386
  • 文/花漫 我一把揭開白布埂息。 她就那樣靜靜地躺著,像睡著了一般遥巴。 火紅的嫁衣襯著肌膚如雪千康。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,837評論 1 290
  • 那天铲掐,我揣著相機(jī)與錄音拾弃,去河邊找鬼。 笑死摆霉,一個(gè)胖子當(dāng)著我的面吹牛豪椿,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播携栋,決...
    沈念sama閱讀 38,987評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼搭盾,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了婉支?” 一聲冷哼從身側(cè)響起鸯隅,我...
    開封第一講書人閱讀 37,730評論 0 267
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎向挖,沒想到半個(gè)月后蝌以,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,194評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡何之,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,525評論 2 327
  • 正文 我和宋清朗相戀三年跟畅,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片溶推。...
    茶點(diǎn)故事閱讀 38,664評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡徊件,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出悼潭,到底是詐尸還是另有隱情庇忌,我是刑警寧澤,帶...
    沈念sama閱讀 34,334評論 4 330
  • 正文 年R本政府宣布舰褪,位于F島的核電站皆疹,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏占拍。R本人自食惡果不足惜略就,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,944評論 3 313
  • 文/蒙蒙 一捎迫、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧表牢,春花似錦窄绒、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,764評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至敲茄,卻和暖如春位谋,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背堰燎。 一陣腳步聲響...
    開封第一講書人閱讀 31,997評論 1 266
  • 我被黑心中介騙來泰國打工掏父, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人秆剪。 一個(gè)月前我還...
    沈念sama閱讀 46,389評論 2 360
  • 正文 我出身青樓赊淑,卻偏偏與公主長得像,于是被迫代替她去往敵國和親仅讽。 傳聞我的和親對象是個(gè)殘疾皇子陶缺,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,554評論 2 349

推薦閱讀更多精彩內(nèi)容

  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫、插件何什、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,066評論 4 62
  • 1组哩、先謀生,再謀愛 2处渣、學(xué)會自我治愈,是生活的必修課 就像馮侖說過的:偉大蛛砰,都是熬出來的罐栈。生活中走得遠(yuǎn)的,都是自愈...
    羅沫沫66閱讀 1,584評論 0 0
  • 兩歲五個(gè)多月的可可什么都要自己來泥畅≤埽“我自己來∥蝗剩“我可以的柑贞。”“我會的聂抢【唬”成天掛在嘴邊。行琳疏,你盡管做有决,爛攤子...
    往事回首閱讀 139評論 0 0
  • 柯達(dá)是在大學(xué)微信群里得知陸珈然已經(jīng)結(jié)婚的闸拿。在過去一個(gè)小時(shí)的唇槍舌戰(zhàn)里,柯達(dá)覺得自己的腦細(xì)胞大量死亡书幕,喉嚨里像被生生...
    張未眠閱讀 366評論 0 3