Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
SwiftでWebPを使ってみた/melon-swift-webp
Search
Taketo Yoshida
July 14, 2016
Programming
1.6k
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
SwiftでWebPを使ってみた/melon-swift-webp
http://fablic.connpass.com/event/35407/
で発表したLT資料です
Taketo Yoshida
July 14, 2016
More Decks by Taketo Yoshida
See All by Taketo Yoshida
Beautiful Japanese line break for the Web
tamanyan
1
610
新しい画像フォーマットHEIFを 用いたiOSアプリの通信量削減/iosdc-heif
tamanyan
9
6.8k
Source Code Generator for Team Development/code-generator-for-team-development
tamanyan
0
1.8k
How to Design Great Alerts/how-to-design-great-alerts
tamanyan
0
670
iOSエンジニアがReact-Nativeに触れてみた/ios-developer-react-native
tamanyan
0
510
フォーシームのスピン量とその効果/the-effect-of-fourseam-fastball-spin-rate
tamanyan
1
950
Objective-CからSwift移行を始めて感じた事/ObjC-to-Swift
tamanyan
1
1.5k
Modern and Practical Networking in Swift
tamanyan
2
840
まだJPEGで消耗してるの?/iOSDC-Reject-Conference
tamanyan
0
3.1k
Other Decks in Programming
See All in Programming
Heart of Swift Concurrency
koher
0
1.1k
AGENTS.md Is Not Enough:Build Skills, Don't Download Them
lx_t
0
130
AI Agent時代のリアーキテクチャ戦略と実践
hokaccha
9
5.2k
Intent as Code
shoppingjaws
6
1.1k
Are APIs Still Relevant in the AI Era?
soyuka
0
390
The Rails Doctrine Decade
koic
2
440
AI時代のコードレビューは人に向けるな、仕組みに向けろ
texmeijin
5
3.2k
Verilogで学ぶCPU自作入門.pdf
uyuki234
7
3.9k
海上で動くGoサーバー: goroutineとchannelでさばく航行データストリーム
atsuki_seo
0
1k
ハーネス設計入門 〜 基礎知識の整理から実務へのステップアップ 〜
kinopeee
19
20k
世界の中心で、AI(App Intents)をさけぶ ー App Intents中心設計の実践ガイド
touyou
0
740
Augmenting AI with the Power of Jakarta EE
ivargrimstad
0
380
Featured
See All Featured
Neural Spatial Audio Processing for Sound Field Analysis and Control
skoyamalab
0
540
Rails Girls Zürich Keynote
gr2m
96
14k
HDC tutorial
michielstock
2
930
SERP Conf. Vienna - Web Accessibility: Optimizing for Inclusivity and SEO
sarafernandez
2
1.6k
Beyond borders and beyond the search box: How to win the global "messy middle" with AI-driven SEO
davidcarrasco
3
270
Building a Modern Day E-commerce SEO Strategy
aleyda
45
9.2k
Stewardship and Sustainability of Urban and Community Forests
pwiseman
0
540
The Invisible Side of Design
smashingmag
301
52k
Accessibility Awareness
sabderemane
1
230
A brief & incomplete history of UX Design for the World Wide Web: 1989–2019
jct
2
510
Avoiding the “Bad Training, Faster” Trap in the Age of AI
tmiket
0
260
世界の人気アプリ100個を分析して見えたペイウォール設計の心得
akihiro_kokubo
PRO
74
42k
Transcript
!.FMPOTXJGU ٢ా݈ਓຊܦࡁ৽ฉࣾ 4XJGUͰ8FC1ΛͬͯΈͨ
2 ٢ా݈ਓʢ:PTIJEB5BLFUPʣ ຊܦࡁ৽ฉࣾͷJ04ΤϯδχΞ ࢴ໘ϏϡʔΞʔΞϓϦͷ։ൃ ϝϩϯ͖Ͱ͢ ࣗݾհ
ࠓJ04Ͱ8FC1Λ༻͢ΔΛ͠·͢ 3
4 (PPHMF͕։ൃ͍ͯ͠Δը૾ϑΥʔϚοτ ՄٯѹॖͱඇՄٯѹॖͷ྆ํΛαϙʔτ ඇՄٯѹॖͰ+1&(ͱൺͯখ͘͞ͳΔ 8FC1ͱʁ
None
6 8FC1,# +1&(,#
4XJGUͰ8FC1Λ͏ʹʁ 7
8 // To build libwebp $ brew install libtool $
brew install automake $ brew install autoconf // Create WebP.framework $ git clone https://chromium.googlesource.com/webm/libwebp $ git checkout 0.5.1 $ ./iosbuild.sh -> WebP.framework Add the WebP Header to your bridging header #include<WebP/decode.h>
9 private func freeImageData(info: UnsafeMutablePointer<Void>, data: UnsafePointer<Void>, size: Int) {
free(UnsafeMutablePointer<Void>(data)) } extension UIImage { static func imageFromWebPData(data: NSData) -> UIImage? { var config = WebPDecoderConfig() if WebPInitDecoderConfig(&config) == 0 { return nil } if WebPGetFeatures(UnsafePointer<UInt8>(data.bytes), data.length, &config.input) != VP8_STATUS_OK { return nil } config.output.colorspace = config.input.has_alpha != 0 ? MODE_rgbA : MODE_RGB if WebPDecode(UnsafePointer<UInt8>(data.bytes), data.length, &config) != VP8_STATUS_OK { return nil } let width = config.input.width let height = config.input.height let provider = CGDataProviderCreateWithData(nil, config.output.u.RGBA.rgba, config.output.u.RGBA.size, freeImageData) let colorSpaceRef = CGColorSpaceCreateDeviceRGB() let components = config.input.has_alpha != 0 ? 4 : 3 let bi = config.input.has_alpha != 0 ? CGBitmapInfo(rawValue: CGBitmapInfo.ByteOrderDefault.rawValue | CGImageAlphaInfo.PremultipliedLast.rawValue) : CGBitmapInfo.ByteOrderMask guard let imageRef = CGImageCreate( Int(width), Int(height), 8, components * 8, components * Int(width), colorSpaceRef, bi, provider, nil, true, .RenderingIntentDefault) else { return nil } return UIImage(CGImage: imageRef) } }
0CKFDUJWF$Ͱॻ͍ͨํ͕ॻ͖͍͢ 10
11 guard let url = NSURL(string: "path/to/image") else { return
} NSURLSession.sharedSession().dataTaskWithURL(url) { (data, response, error) in guard let data = data else { return } // Convert NSData to UIImage in Background Threads dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) { let image = UIImage.imageFromWebPData(data) ?? UIImage(data: data) // Handle image } }
ܦͰࢴ໘ϏϡʔΞʔͰ8FC1Λ༻ 12
13 ࢴ໘ΠϝʔδΛ8FC1Ͱ৴ +1&(ͱಉըૉͰݮ˞ ಉըૉͰϊΠζΛখ͘͞ ˞݄ͷேץͰଌఆ
ܦͰΤϯδχΞΛืूͯ͠·͢ 14 IUUQTTOJLLFJDPNTBJZP