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
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
SwiftでWebPを使ってみた/melon-swift-webp
tamanyan
1
1.6k
Other Decks in Programming
See All in Programming
AI時代に学ぶ 好きなルール 嫌いなルール Linter編
shorty5121
0
150
[PyCon KR 2026] More Variants, More Diversity for AI Accelerators
achimnol
0
110
170k Jobs a Day on GKE: Scaling Mercari's CI Platform - and What's Next for AI-Native Development
junyaokabe
0
120
in-process GraphQL のすすめ #ginzajs
izumin5210
4
1.5k
わからない話を追いかけたら、プログラミング言語を作る側にいた
ydah
3
550
Press start. Python's next generation.
willingc
PRO
3
150
AI Engineeringは、AIプロダクトだけのものか? 〜AIがソフトウェアを作る時代の新しい当たり前〜 / No AI in your product. AI Engineering in your development.
rkaga
5
530
AWS Transform Customによる Spring Boot 2.xから4.xへのVerUp
satoshi256kbyte
2
100
freeeにおけるEvalsの実践例の紹介
freee
PRO
0
150
生成AIで帳票OCRが「簡単に」作れる時代になった?
kon_shou
0
1.2k
私のClaude Code活用法 (個人開発編) - PHPerKaigi mini #4(2026/08/24)
panda_program
1
160
仕様駆動開発へのトライを機に チームに適合する手法を模索し続けている話
freee
PRO
0
620
Featured
See All Featured
Reflections from 52 weeks, 52 projects
jeffersonlam
356
21k
End of SEO as We Know It (SMX Advanced Version)
ipullrank
3
4.4k
First, design no harm
axbom
PRO
2
1.3k
Imperfection Machines: The Place of Print at Facebook
scottboms
270
14k
The Straight Up "How To Draw Better" Workshop
denniskardys
239
140k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
254
22k
We Analyzed 250 Million AI Search Results: Here's What I Found
joshbly
1
1.9k
The SEO Collaboration Effect
kristinabergwall1
1
530
[SF Ruby Conf 2025] Rails X
palkan
2
1.3k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
141
35k
We Are The Robots
honzajavorek
0
310
世界の人気アプリ100個を分析して見えたペイウォール設計の心得
akihiro_kokubo
PRO
73
41k
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