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
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
580
新しい画像フォーマット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
660
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
Flow は今どうなっているか
mizdra
PRO
0
720
Introducing Stack Pull Request in GitHub
kkamegawa
0
100
AI Readyの正体はデータマネジメントだ メダリオン2.0の最前線
freee
PRO
0
390
VibeCodingからAgenticWorkflowへ
starfish719
0
870
引き算の組織 ― アウトカムとAIに全振りするために辞めたこと ― / Organization by Subtraction
hirokiyamamoto14
PRO
0
300
AWS Transform Customによる Spring Boot 2.xから4.xへのVerUp
satoshi256kbyte
2
100
Press start. Python's next generation.
willingc
PRO
3
150
異なる設計思想のフレームワークを経験して得た学び
amekuhideki
1
570
「人を評価する AI」の設計と実装
ryoyanara
0
240
Pythonの実行はどこまで賢くなったのか? CPythonとPyPyから見る最適化のしくみ
curekoshimizu
3
2k
プロポーザルを書いてもらう
pvcresin
0
580
使いながら育てる Claude Code — 開発フローの1コマンド化 × 繰り返し指摘の自動仕組み化
shiki_kakaku
1
2k
Featured
See All Featured
Getting science done with accelerated Python computing platforms
jacobtomlinson
2
450
Writing Fast Ruby
sferik
630
63k
How to Ace a Technical Interview
jacobian
281
24k
Fashionably flexible responsive web design (full day workshop)
malarkey
408
67k
The Invisible Side of Design
smashingmag
301
52k
Amusing Abliteration
ianozsvald
1
260
Neural Spatial Audio Processing for Sound Field Analysis and Control
skoyamalab
0
410
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
254
22k
What Being in a Rock Band Can Teach Us About Real World SEO
427marketing
0
1.1k
Measuring & Analyzing Core Web Vitals
bluesmoon
9
970
Navigating Algorithm Shifts & AI Overviews - #SMXNext
aleyda
1
1.6k
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
10
1.3k
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