Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Live PhotoをアニメーションGIFに書き出す
Search
Kei Ito
March 30, 2016
Technology
1.4k
2
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Live PhotoをアニメーションGIFに書き出す
関西モバイルアプリ研究会 #12 の資料です
http://kanmoba.connpass.com/event/28411/
Kei Ito
March 30, 2016
More Decks by Kei Ito
See All by Kei Ito
20211015 Mac CatalystでmacOS用アプリを作る
itok
2
4.5k
20210219 Flutterに入門してみた
itok
1
4.1k
20201009 iOS 14 ウィジェットをつくってみた
itok
1
2.5k
20191206 Property Wrappers 入門
itok
0
1.7k
20190920 iOS 13 対応ではまった話
itok
1
2.5k
20190726 Background App Refresh Taskがやってきた
itok
0
2.3k
20190722 Firebase Remote Configでアドネットワークを管理する
itok
0
1.7k
20190419 iOSアプリで証明書の情報を参照する
itok
0
1.6k
20190412 Android TV向けアプリを作ってみる
itok
0
1.1k
Other Decks in Technology
See All in Technology
WEBフロントエンド研修【MIXI 26新卒技術研修】
mixi_engineers
PRO
1
760
AI時代におけるエンジニアの新たな役割──FDEとクオリアの探求/登壇資料(戸井田 裕貴)
hacobu
PRO
0
670
AI駆動開発は個人技からチーム戦へ:組織でAIを使いこなすための実践設計
moongift
PRO
0
320
脱Jenkins、インターン生が挑んだCIツールGitHubActions移行
mixi_engineers
PRO
1
270
基調講演:人とAIをつなぐIoTの今と未来 ー 「フィジカル」と「デジタル」が出会うその先へ【SORACOM Discovery 2026】
soracom
PRO
0
360
もう一度考える SRE チームの作り方・育て方 / Rethinking SRE #1: Building and Growing SRE Teams
rrreeeyyy
1
150
AIQAのナレッジ構築について
qatonchan
1
130
BigQuery を検索ソースとした AI Agent の作り方って 〇〇 通りあんねん
satohjohn
0
140
データエンジニアこそ組織のオントロジーに向き合うべき — 問いに答えるAIから、事業を動かすAIへ
gappy50
6
2.6k
PLaMo 3.0 Primeの事後学習
pfn
PRO
0
200
なぜ、あなたのエージェントは言うことを聞かないのか
segavvy
1
580
害獣害虫を自動判別! ペストコントロール支援ビジネス成功のヒント【SORACOM Discovery 2026】
soracom
PRO
0
130
Featured
See All Featured
Conquering PDFs: document understanding beyond plain text
inesmontani
PRO
4
2.9k
YesSQL, Process and Tooling at Scale
rocio
174
15k
How To Stay Up To Date on Web Technology
chriscoyier
790
250k
BBQ
matthewcrist
89
10k
Large-scale JavaScript Application Architecture
addyosmani
515
110k
A brief & incomplete history of UX Design for the World Wide Web: 1989–2019
jct
2
430
4 Signs Your Business is Dying
shpigford
187
22k
Prompt Engineering for Job Search
mfonobong
0
390
How Software Deployment tools have changed in the past 20 years
geshan
1
34k
Designing for humans not robots
tammielis
254
26k
Rebuilding a faster, lazier Slack
samanthasiow
85
9.6k
Leadership Guide Workshop - DevTernity 2021
reverentgeek
1
330
Transcript
-JWF1IPUPΛ Ξχϝʔγϣϯ(*'ʹ ॻ͖ग़͢ ؔϞόΠϧΞϓϦݚڀձ !JUPL@UXJU
!JUPL@UXJU w ͍ͱ͏͚͍ʢJUPLʣ w ɹɹɹɹɹɹͷதͷਓ w ެࢲڞʹϓϩάϥϚJ04.BDʢͨ·ʹ"OESPJE8JOEPXTʣ w IUUQJUPLKQ IUUQTPSBLB[FDPKQ
ॴ USZTXJGU։࠵த
-JWF1IPUP͔ͬͯͭͬͯ·͢ʙʁ ڞ༗͢Δͷ͕େมͳΜͰ͢ΑͶʙ Ξχϝʔγϣϯ(*'ʹ͢ΔΞϓϦ ͋ΔΈ͍ͨͳΜͰ͚͢ͲͶ͑ʙ
͋ɺͦΕɺͰ͖·͢Α "7'PVOEBUJPOͱ͔*NBHF*0͑
ͬͯΈͨ
ΰʔϧ
ඞཁͳͷ w J04Ҏ্ w 1IPUPT w "7'PVOEBUJPO w *NBHF*0 w
J1IPOFTT1MVT4&J1BE1SPJODI
-JWF1IPUPΛ୳͢ // get all images let result = PHAsset.fetchAssetsWithMediaType(.Image, options:
nil) var photoAsset: PHAsset? result.enumerateObjectsUsingBlock { (obj, idx, stop) -> Void in let asset = obj as! PHAsset if asset.mediaSubtypes.contains(.PhotoLive) { photoAsset = asset stop.memory = true } })
-JWF1IPUPΛ୳͢ let mgr = PHImageManager.defaultManager() mgr.requestLivePhotoForAsset(photoAsset, targetSize: CGSizeZero, contentMode: .Default,
options: nil) { (livePhoto, info) -> Void in if let livePhoto = livePhoto { self.livePhotoView.livePhoto = livePhoto } }
ಈըΛऔΓग़͢ // search movie in live photo let resources =
PHAssetResource.assetResourcesForLivePhoto(photo) for resource in resources { if resource.type == .PairedVideo { self.getMovieData(resource) break } }
ಈըΛऔΓग़͢ // load movie data let mgr = PHAssetResourceManager.defaultManager() mgr.requestDataForAssetResource(resource,
options: nil, dataReceivedHandler: { (data) -> Void in movieData.appendData(data) }) { (err) -> Void in do { try movieData.writeToURL(movieURL, options:.AtomicWrite) let movieAsset = AVAsset(URL: movieURL) self.convertToGif(movieAsset, resource: resource) } catch { } }
ը૾ΛऔΓग़͢ // generate thumbnails and write to gif let generator
= AVAssetImageGenerator(asset: movieAsset) // generate in any timelines generator.requestedTimeToleranceBefore = kCMTimeZero generator.requestedTimeToleranceAfter = kCMTimeZero // apply video transform generator.appliesPreferredTrackTransform = true generator.maximumSize = CGSizeMake(640, 640) generator.generateCGImagesAsynchronouslyForTimes(times) { (requested, image, actual, result, err) -> Void in // }
"OJNBUJPO(*'ʹॻ͖ग़͢ let gif = CGImageDestinationCreateWithURL (gifURL, kUTTypeGIF, numFrame, nil) let
frameProperty = .. // AVAssetImageGenerator’s loop { CGImageDestinationAddImage(gif, image, frameProperty) } let gifProperty = .. CGImageDestinationSetProperties(gif, gifProperty) CGImageDestinationFinalize(gif) self.webView.loadRequest(NSURLRequest(URL: gifURL))
ίʔυͪ͜Βʹ HJUIVCDPNJUPL-JWF1IPUP5P"OJNBUFE(JG