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
530
新しい画像フォーマット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
dRuby over BLE
makicamel
2
380
「なぜそう決めたのか」を残し続ける仕組み ― Notion AI カスタムエージェント × Slack連携による設計判断の自動記録 - NIKKEI Tech Talk #47
niftycorp
PRO
0
210
IBM Bobを活用したレガシーアプリの最新化
oniak3ibm
PRO
1
200
「エンジニアインターン、どうやって取った?」準備のリアルを語るLT会 Progate BAR
akiomatic
0
140
Go1.27で導入されるジェネリクスメソッドでできること
mackee
0
140
さぁV100、メモリをお食べ・・・
nilpe
0
150
Performance Engineering for Everyone
elenatanasoiu
0
180
Creating Composable Callables in Contemporary C++
rollbear
0
150
フロントエンドとバックエンドで「1文字」を揃えよう
youkidearitai
PRO
0
710
生成AI時代にこそ効くGo | Why Go Works in the Age of Generative AI
mom0tomo
8
3.3k
Semantic Version 単位で戦略を柔軟に変えて、パッケージアップデートを自動化する
daitasu
1
260
Hunting Vulnerabilities in Symfony with LLMs
vinceamstoutz
0
550
Featured
See All Featured
Six Lessons from altMBA
skipperchong
29
4.3k
A better future with KSS
kneath
240
18k
The World Runs on Bad Software
bkeepers
PRO
72
12k
<Decoding/> the Language of Devs - We Love SEO 2024
nikkihalliwell
1
250
The Impact of AI in SEO - AI Overviews June 2024 Edition
aleyda
5
1.1k
The Spectacular Lies of Maps
axbom
PRO
1
820
Crafting Experiences
bethany
1
180
Ecommerce SEO: The Keys for Success Now & Beyond - #SERPConf2024
aleyda
1
2k
Visualization
eitanlees
152
17k
Groundhog Day: Seeking Process in Gaming for Health
codingconduct
0
210
Scaling GitHub
holman
464
140k
Conquering PDFs: document understanding beyond plain text
inesmontani
PRO
4
2.8k
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