Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Speaker Deck
PRO
Sign in
Sign up for free
SwiftでWebPを使ってみた/melon-swift-webp
Taketo Yoshida
July 14, 2016
Programming
1
920
SwiftでWebPを使ってみた/melon-swift-webp
http://fablic.connpass.com/event/35407/
で発表したLT資料です
Taketo Yoshida
July 14, 2016
Tweet
Share
More Decks by Taketo Yoshida
See All by Taketo Yoshida
Beautiful Japanese line break for the Web
tamanyan
1
67
新しい画像フォーマットHEIFを 用いたiOSアプリの通信量削減/iosdc-heif
tamanyan
9
5.5k
Source Code Generator for Team Development/code-generator-for-team-development
tamanyan
0
1.4k
How to Design Great Alerts/how-to-design-great-alerts
tamanyan
0
360
iOSエンジニアがReact-Nativeに触れてみた/ios-developer-react-native
tamanyan
0
360
フォーシームのスピン量とその効果/the-effect-of-fourseam-fastball-spin-rate
tamanyan
1
680
Objective-CからSwift移行を始めて感じた事/ObjC-to-Swift
tamanyan
1
1.2k
Modern and Practical Networking in Swift
tamanyan
2
650
まだJPEGで消耗してるの?/iOSDC-Reject-Conference
tamanyan
0
2.8k
Other Decks in Programming
See All in Programming
Efficient UI testing in Android
alexzhukovich
1
120
料理の注文メニューの3D化への挑戦
hideg
0
280
Cloudflare WorkersでGoのHTTPサーバーを動かすライブラリを作った話
syumai
0
150
FullStack eXchange, July 2022
brucel
0
200
Regular expressions basics/正規表現の基本
kishikawakatsumi
6
260
フロントエンドエンジニアが変える現場のモデリング意識/modeling-awareness-changed-by-front-end-engineers
uggds
32
13k
Enzyme から React Native Testing Library に移行した経緯 / 2022-07-20
tamago3keran
1
160
Computer Vision Seminar 1/コンピュータビジョンセミナーvol.1 OpenCV活用
fixstars
0
170
WindowsコンテナDojo:第6回 Red Hat OpenShift入門
oniak3ibm
PRO
0
180
Rに管理されてみる
kazutan
0
250
ECサイトの脆弱性診断をいい感じにやりたい/OWASPKansaiNight_LT1_220727
owaspkansai
0
290
More Than Micro Frontends: 3 Further Use Cases for Module Federation @DWX 2022
manfredsteyer
PRO
0
370
Featured
See All Featured
Streamline your AJAX requests with AmplifyJS and jQuery
dougneiner
127
8.5k
4 Signs Your Business is Dying
shpigford
169
20k
ParisWeb 2013: Learning to Love: Crash Course in Emotional UX Design
dotmariusz
100
6k
Raft: Consensus for Rubyists
vanstee
127
5.5k
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
37
3.3k
Gamification - CAS2011
davidbonilla
75
3.9k
Automating Front-end Workflow
addyosmani
1351
200k
Unsuck your backbone
ammeep
659
55k
10 Git Anti Patterns You Should be Aware of
lemiorhan
638
52k
Testing 201, or: Great Expectations
jmmastey
21
5.5k
Building a Scalable Design System with Sketch
lauravandoore
448
30k
Bootstrapping a Software Product
garrettdimon
296
110k
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