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
まだJPEGで消耗してるの?/iOSDC-Reject-Conference
Search
Taketo Yoshida
August 30, 2016
Programming
3.1k
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
まだJPEGで消耗してるの?/iOSDC-Reject-Conference
http://iosdc-reject-conference.connpass.com/event/37017/
で発表したスライド
Taketo Yoshida
August 30, 2016
More Decks by Taketo Yoshida
See All by Taketo Yoshida
Beautiful Japanese line break for the Web
tamanyan
1
540
新しい画像フォーマット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
650
iOSエンジニアがReact-Nativeに触れてみた/ios-developer-react-native
tamanyan
0
500
フォーシームのスピン量とその効果/the-effect-of-fourseam-fastball-spin-rate
tamanyan
1
940
Objective-CからSwift移行を始めて感じた事/ObjC-to-Swift
tamanyan
1
1.5k
Modern and Practical Networking in Swift
tamanyan
2
840
SwiftでWebPを使ってみた/melon-swift-webp
tamanyan
1
1.6k
Other Decks in Programming
See All in Programming
LaravelLive Japan の裏方のすべて — 第188回 PHP勉強会@東京 (2026-06-24)
suguruooki
2
150
Hunting Vulnerabilities in Symfony with LLMs
vinceamstoutz
0
580
共通化で考えるべきは、実装より公開する型だった
codeegg
0
210
技術記事、 専門家としてのプログラマ、 言語化
mizchi
14
7.4k
1年で人数1.5倍、PR数5.5倍増。 品質とアウトカムはどうなったか、 何が効いたか
ike002jp
0
120
エンジニア向け会社紹介/Findy Company Profile
findyinc
6
360k
Signal Forms: Details & Live Coding @enterJS 2026 in Mannheim
manfredsteyer
PRO
0
230
AI時代の仕事技芸論〜ソフトウェア開発で「遊ぶように働く」職人的熟達のすすめ(スクフェス仙台 2026バージョン)
kuranuki
0
610
Semantic Version 単位で戦略を柔軟に変えて、パッケージアップデートを自動化する
daitasu
1
350
過去最大のMCPアップデート! 2026-07-28 RC版の謎に迫る
licux
6
460
【やさしく解説 設計編・中級 #1】一つの車に、運転手は一人 ~ある倉庫システムの事例から~
panda728
PRO
0
170
OS アップデート対応の取り組み方がもっと共有されてほしい
andpad
0
110
Featured
See All Featured
StorybookのUI Testing Handbookを読んだ
zakiyama
31
6.8k
Chasing Engaging Ingredients in Design
codingconduct
0
230
Paper Plane (Part 1)
katiecoart
PRO
0
9.6k
The Illustrated Guide to Node.js - THAT Conference 2024
reverentgeek
1
410
Large-scale JavaScript Application Architecture
addyosmani
515
110k
A designer walks into a library…
pauljervisheath
211
24k
Unsuck your backbone
ammeep
672
58k
Product Roadmaps are Hard
iamctodd
55
12k
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
28
3.6k
We Are The Robots
honzajavorek
0
270
AI Search: Implications for SEO and How to Move Forward - #ShenzhenSEOConference
aleyda
1
1.3k
Exploring anti-patterns in Rails
aemeredith
3
440
Transcript
1 ·ͩ+1&(Ͱফͯ͠Δͷʁ ʙ8FC1ͰΔշద৽ฉϥΠϑʙ ٢ా݈ਓຊܦࡁ৽ฉࣾσδλϧฤہฤ෦
2 ຊܦࡁ৽ฉࣾͷJ04ΤϯδχΞ ࣗݾհ ࢴ໘ϏϡʔΞʔΞϓϦͷ։ൃ (JUIVC!UBNBOZBO ٢ా݈ਓ :PTIJEB5BLFUP
3 গ͠Ͱը૾ͷ௨৴ྔΛݮΒͯ͠ μϯϩʔυΛ͍ͨ͘͠ʜ
4 J04্Ͱ8FC1Λ༻ͯ͠ಘͨ ݟΛൃද͠·͢
5 8FC1ͱʁ (PPHMF͕։ൃ͍ͯ͠Δը૾ϑΥʔϚοτ ՄٯѹॖͱඇՄٯѹॖͷ྆ํΛαϙʔτ ඇՄٯѹॖͰ+1&(ͱൺͯখ͘͞ͳΔ
6 ଞࣾͷ࠾༻ࣄྫ
7 IUUQXXXTMJEFTIBSFOFUTVTJFZZJPTJPT
8 IUUQUFDIMJGFDPPLQBEDPNFOUSZ
9 IUUQIPNFTEFTJHOFSTIBUFOBCMPHDPNFOUSZ
10 ܦͰࢴ໘ϏϡʔΞʔͰ8FC1Λ༻
11 ࢴ໘ΠϝʔδΛ8FC1Ͱ৴ +1&(ͱಉըૉͰݮ ಉըૉͰϊΠζΛখ͘͞ ˞݄ͷேץͰଌఆ
12 ༰ྔ.#ˠ.# μϯϩʔυඵˠඵ ˞݄ͷேץͰଌఆ
13 J04ʹͯ8FC1Λѻ͏ʹ
14 MJCXFCQΛ༻͢Δ IUUQTHJUIVCDPNXFCNQSPKFDUMJCXFCQ
15 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) } } MJCXFCQΛѻ͍͘͢͢ΔͨΊʹ&YUFOTJPOΛॻ͘
16 ϙΠϯλʔຬࡌͳΜͰ0CK$Ͱ ॻ͍ͨํָ͕͔ʜ
17 J04Ͱ8FC1αϙʔτ֎ͳͷʁ
18 IUUQXXXDOFUDPNOFXTBQQMFJPTNBDPTUFTUTHPPHMFTXFCQHSBQIJDTUPTQFFEVQXFC
19 αϙʔτŝŦᴸᴸᴸ ƅ˲ƅ ᴸᴸᴸ
20 J04CFUBͰݕূͯ͠Έͨ
21
22 ( ゚д゚) ・・・ (つд⊂)ゴシゴシ (;゚д゚) ・・・ (つд⊂)ゴシゴシゴシ
_, ._ (;゚ Д゚) …!?
23 Ͳ͏͍͏͜ͱͩͬͯΑ
24 5XJUUFSͰௐͯΈͨ
25
26
27 ͬͺŠŮᴸᴸᴸᴸ "A ᴸᴸᴸᴸ
28 ࠓͷͱ͜ΖMJCXFCQΛ͏͔͠ͳ͍
29 8FC1ͷύϑΥʔϚϯε
30 8FC1ͷύϑΥʔϚϯε ࣮ࡍ+1&(ͱൺֱͨ࣌͠ͷαΠζʁ μϯϩʔυ͔Βදࣔ·Ͱʹ͔͔Δ࣌ؒʁ ը࣭ͷධՁͲͷΑ͏ʹߦ͏ʁ
31 ݄ேץϖʔδࠂ໘ ˞.#ͷ1/( YQY
32 QY QY QY QY QY ͭͷαΠζͷը૾+1&(ͱ8Λ༻ҙ͢Δ
33 ࣮ࡍ+1&(ͱൺֱͨ࣌͠ͷαΠζʁ
34 ը૾ͷԣαΠζ QY +1&(ͷαΠζ ,# 8FC1ͷαΠζ ,#
dͷαΠζͷݮ
35 μϯϩʔυ͔Βදࣔ·Ͱʹ ͔͔Δ࣌ؒʁ
36 J04Ͱ8FC1Λ༻͢Δ࣌ σίʔυ࣌ؒΛߟྀ͢Δඞཁ͕͋Δ
37 EPXOMPBE࣌ؒ KQFHEFDPEF࣌ؒ +1&(ͷ߹ ࣮࣭ͷμϯϩʔυ࣌ؒ
38 EPXOMPBE࣌ؒ XFCQEFDPEF࣌ؒ 8FC1ͷ߹ ࣮࣭ͷμϯϩʔυ࣌ؒ
39 var start = NSDate() [download(url128a), download(url128b), download(url128c), download(url128d), download(url128e)].sequence().then
{ images in let elapsed = NSDate().timeIntervalSinceDate(start) NSLog(elapsed) } ͭͷϑΝΠϧΛಉ࣌ʹμϯϩʔυͯ͠6**NBHF·Ͱ མͱ͜͠Μͩ࣌ͷ࣌ؒΛ࣮࣭ͷμϯϩʔυ࣌ؒͱͯ͠ܭଌ ˞࣮ݧڥJ1IPOFT4PGUCBOL(-5&
40 0 0.2 0.4 0.6 0.8 1 1.2 1.4 1.6
1.8 2 128 256 512 1024 2048 ) ( webp jpeg ը૾αΠζ͕େ͖͍΄Ͳ࣮࣭ͷμϯϩʔυ࣌ؒॖ͞ΕΔ
41 ը૾αΠζ͕େ͖͍΄Ͳ ௨৴ίετσίʔυίετ
42 ৽ฉͷΑ͏ͳըૉ͕ଟ͍ը૾ μϯϩʔυ͢ΔΞϓϦʹ༗ޮ
43 ը࣭ͷධՁͲͷΑ͏ʹߦ͏ʁ
44 44*. ͭͷը૾͕Ͳͷఔࣅ௨͍ͬͯΔ͔Λஅ͢Δख๏ Ұൠతʹ44*.ͷ͕Ҏ্͋ΕΦϦδφϧͱಉͷ࣭ αΠζΛ͑ͭͭྼԽ͠ͳ͍ϥΠϯͰύϥϝʔλΛௐ͢Δ
45 IUUQTHJUIVCDPNKUFSSBDFQZTTJN
46 ·ͱΊ
47 ·ͱΊ J04ͷ8FC1ͷαϙʔτΛকདྷతʹ͋Δ͔ ըૉ͕ଟ͍ը૾Λ͍ͬͯΔͳΒ8FC1Λ͏Ձ͕͋Δ 44*.Λར༻͢Δ͜ͱͰը࣭ͷධՁ͕Մೳ
48 5IBOLZPVGPSMJTUFOJOHUPNF