Slide 1

Slide 1 text

-JWF1IPUPΛ Ξχϝʔγϣϯ(*'ʹ ॻ͖ग़͢ ؔ੢ϞόΠϧΞϓϦݚڀձ !JUPL@UXJU

Slide 2

Slide 2 text

!JUPL@UXJU w ͍ͱ͏͚͍ʢJUPLʣ w ɹɹɹɹɹɹͷதͷਓ w ެࢲڞʹϓϩάϥϚJ04.BDʢͨ·ʹ"OESPJE΍8JOEPXTʣ w IUUQJUPLKQ IUUQTPSBLB[FDPKQ

Slide 3

Slide 3 text

๭೔౎಺๭ॴ USZTXJGU։࠵த

Slide 4

Slide 4 text

-JWF1IPUP͔ͬͯͭͬͯ·͢ʙʁ ڞ༗͢Δͷ͕େมͳΜͰ͢ΑͶʙ Ξχϝʔγϣϯ(*'ʹ͢ΔΞϓϦ΋ ͋ΔΈ͍ͨͳΜͰ͚͢ͲͶ͑ʙ

Slide 5

Slide 5 text

͋ɺͦΕɺͰ͖·͢Α "7'PVOEBUJPOͱ͔*NBHF*0࢖͑͹

Slide 6

Slide 6 text

΍ͬͯΈͨ

Slide 7

Slide 7 text

ΰʔϧ

Slide 8

Slide 8 text

ඞཁͳ΋ͷ w J04Ҏ্ w 1IPUPT w "7'PVOEBUJPO w *NBHF*0 w J1IPOFTT1MVT4&J1BE1SPJODI

Slide 9

Slide 9 text

-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 } })

Slide 10

Slide 10 text

-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 } }

Slide 11

Slide 11 text

ಈըΛऔΓग़͢ // search movie in live photo let resources = PHAssetResource.assetResourcesForLivePhoto(photo) for resource in resources { if resource.type == .PairedVideo { self.getMovieData(resource) break } }

Slide 12

Slide 12 text

ಈըΛऔΓग़͢ // 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 { } }

Slide 13

Slide 13 text

ը૾ΛऔΓग़͢ // 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 // }

Slide 14

Slide 14 text

"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))

Slide 15

Slide 15 text

׬੒

Slide 16

Slide 16 text

ίʔυ͸ͪ͜Βʹ HJUIVCDPNJUPL-JWF1IPUP5P"OJNBUFE(JG