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
SLOをサービス品質の共通言語にするために 取り組んできたこと
wakana0222
0
480
LLMによるContent Moderationの本番運用の裏側と品質担保への挑戦
suikabar
3
840
ローカルLLMでどこまでコードが書けるか -拡張版 / How much code can be written on a local LLM Extended
kishida
12
4.7k
エンジニアと一緒にテストコードの設計と実装を改善した話
mototakatsu
0
260
「正の参照」と 「負の導出」で組む ハーネスエンジニアリング
cottpan
1
140
なぜ型を書くのか? TSKaigi2026で改めて考える #tskaigi_smarthr
kajitack
0
340
act1-costs.pdf
sumedhbala
0
210
AIを活用したE2Eテスト実装効率化のあゆみ / ebisu-mobile-14-kotetu
kotetuco
0
170
鹿野さんに聞く!『TypeScriptコードレシピ集』で磨く実践力
tonkotsuboy_com
4
1.1k
Claude Team Plan導入・ガイド
tk3fftk
0
170
1年で人数1.5倍、PR数5.5倍増。 品質とアウトカムはどうなったか、 何が効いたか
ike002jp
0
120
Developing with AI Agents — Codex, Claude Code & Cowork Practical Guide
x5gtrn
PRO
0
1.4k
Featured
See All Featured
Music & Morning Musume
bryan
47
7.3k
Taking LLMs out of the black box: A practical guide to human-in-the-loop distillation
inesmontani
PRO
3
2.3k
Joys of Absence: A Defence of Solitary Play
codingconduct
1
410
Digital Ethics as a Driver of Design Innovation
axbom
PRO
1
340
HDC tutorial
michielstock
2
740
How Fast Is Fast Enough? [PerfNow 2025]
tammyeverts
3
650
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
360
30k
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
28
3.6k
The agentic SEO stack - context over prompts
schlessera
0
840
Claude Code どこまでも/ Claude Code Everywhere
nwiizo
65
56k
Mozcon NYC 2025: Stop Losing SEO Traffic
samtorres
1
310
Making the Leap to Tech Lead
cromwellryan
135
10k
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