Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Traitement d'image simple et rapide avec Rende...
Search
Quentin Menini
April 24, 2018
Programming
660
2
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Traitement d'image simple et rapide avec Renderscript
Quentin Menini
April 24, 2018
Other Decks in Programming
See All in Programming
Apple Intelligence を用いた個人情報誤送信防止、及びユーザーリクエスト体験の改善について
yukiny
0
140
【高い買い物LT会】初任給で話題の国産フィジカルAIを買った話
akagami
PRO
0
170
Webの地図
yosuke_furukawa
PRO
6
4.7k
市販E-Readerを乗っ取れ 〜Embedded Swiftで電子ペーパーガジェットを制御する〜
trickart
0
210
モバイル交通系ICへのチャージ実例から考える、クロスプラットフォーム開発におけるiOS実機テスト設計とCI運用
yusuga
1
540
SONY CISC-NEWS NWS-1750 + NWB-225 フレームバッファの NetBSD/news68k ドライバ実装 / OSC2026Hiroshima
tsutsui
0
150
Everything will be SERVERLESS — 信じて運用した10年の経験値 / Everything Will be Serverless — Lessons Learned from 10 Years of Operational Experience
seike460
PRO
1
490
『寄り添うラジオ』をAIで作る 体験価値から逆算した、会話しないUXと品質設計
theoriatec2024
3
190
[Rails World 2026] Durable orchestration on Rails: from continuation to workflow
palkan
1
290
UPDATE をやめる — EF Core でマスタをバージョン管理する
panda728
PRO
0
610
個人開発基盤をまるごとCloudflareに引っ越して爆速で総合的体験を向上させた話
tinykitten
0
200
AWS DevOps Agentで インシデント対応をAIに任せたい
honmarkhunt
7
3.2k
Featured
See All Featured
The Illustrated Children's Guide to Kubernetes
chrisshort
51
53k
Marketing Yourself as an Engineer | Alaka | Gurzu
gurzu
0
310
Dominate Local Search Results - an insider guide to GBP, reviews, and Local SEO
greggifford
PRO
0
340
How to Build an AI Search Optimization Roadmap - Criteria and Steps to Take #SEOIRL
aleyda
1
2.2k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
PRO
203
76k
Navigating the moral maze — ethical principles for Al-driven product design
skipperchong
2
580
Between Models and Reality
mayunak
4
470
Leading Effective Engineering Teams in the AI Era
addyosmani
9
2.6k
Evolving SEO for Evolving Search Engines
ryanjones
0
300
The Director’s Chair: Orchestrating AI for Truly Effective Learning
tmiket
1
300
The Anti-SEO Checklist Checklist. Pubcon Cyber Week
ryanjones
0
250
Claude Code どこまでも/ Claude Code Everywhere
nwiizo
67
58k
Transcript
RenderScript Traitement d’image simple et rapide sur Android
Traitement d’image : pourquoi c’est chiant ?
Traitement d’image : pourquoi c’est chiant ?
Traitement d’image : pourquoi c’est chiant ?
Traitement d’image : pourquoi c’est chiant ? 4032 3024
Traitement d’image : pourquoi c’est chiant ? 4032 3024 .
12 192 768 Pixels .
Traitement d’image : pourquoi c’est chiant ? 4032 3024 .
12 192 768 Pixels . for (i in 0 .. 12192768)
Traitement d’image : pourquoi c’est chiant ? for (i in
0 .. 12192768)
Traitement d’image : pourquoi c’est chiant ? for (i in
0 .. 12192768) ➔
Traitement d’image : pourquoi c’est chiant ? for (i in
0 .. 12192768) 4 368 ms ➔
Traitement d’image : pourquoi c’est chiant ? ➔ 12 192
768 Pixels ➔ 12 192 768 int
Traitement d’image : pourquoi c’est chiant ? ➔ 12 192
768 Pixels ➔ 46,5 Mo
Traitement d’image : pourquoi c’est chiant ? ➔ 46,5 Mo
12 192 768 Pixels ➔ 46,5 Mo
Traitement d’image : pourquoi c’est chiant ? ➔ 46,5 Mo
46,5 Mo 12 192 768 Pixels ➔ 46,5 Mo
Traitement d’image : pourquoi c’est chiant ? ➔ Out of
Memory 46,5 Mo 46,5 Mo 12 192 768 Pixels ➔ 46,5 Mo
➔ 46,5 Mo 46,5 Mo Traitement d’image : pourquoi c’est
chiant ? Out of Memory 12 192 768 Pixels ➔ 46,5 Mo
Traitement d’image : des solutions qui font souffrir
JNI/C/C++ (CPU)
JNI/C/C++ (CPU) Cross compilation
JNI/C/C++ (CPU) Cross compilation Interface C++/Java
JNI/C/C++ (CPU) Cross compilation Interface C++/Java Plus lent pour le
calcul parallèle (CPU vs GPU)
OpenGL (GPU)
OpenGL (GPU) Coder en OpenGL c’est compliqué
OpenGL (GPU) Coder en OpenGL c’est compliqué GL_MAX_TEXTURE_SIZE
OpenGL (GPU) Coder en OpenGL c’est compliqué GL_MAX_TEXTURE_SIZE Fait pour
du render, pas du calcul parallèle
RenderScript
RenderScript
RenderScript Fonctionne sur GPU, CPU et/ou DSP
RenderScript Fonctionne sur GPU, CPU et/ou DSP « Write once,
run anywhere »
RenderScript Fonctionne sur GPU, CPU et/ou DSP « Write once,
run anywhere » Parallélisation gérée par RenderScript
RenderScript Fonctionne sur GPU, CPU et/ou DSP « Write once,
run anywhere » Parallélisation gérée par RenderScript for (int i = 0; i < 12192768; i++) { out[i] = doSomething(in[i]) }
Temps de calcul du blur Java 4 368 ms
Temps de calcul du blur Java 4 368 ms Renderscript
516 ms
Temps de calcul du blur Java 4 368 ms Renderscript
516 ms 8x plus rapide
Renderscript pour les nuls : blur
None
Blur.java RenderScript rs = RenderScript.create(context); Allocation in = Allocation.createFromBitmap(rs, bitmap);
Type t = in.getType(); Allocation out = Allocation.createTyped(rs, t); ScriptIntrinsicBlur script = ScriptIntrinsicBlur.create(rs, Element.U8_4(rs)); script.setRadius(radius); script.setInput(in); script.forEach(out); out.copyTo(bitmap); in.destroy(); out.destroy(); script.destroy(); rs.destroy(); return bitmap;
Blur.java RenderScript rs = RenderScript.create(context); Allocation in = Allocation.createFromBitmap(rs, bitmap);
Type t = in.getType(); Allocation out = Allocation.createTyped(rs, t); ScriptIntrinsicBlur script = ScriptIntrinsicBlur.create(rs, Element.U8_4(rs)); script.setRadius(radius); script.setInput(in); script.forEach(out); out.copyTo(bitmap); in.destroy(); out.destroy(); script.destroy(); rs.destroy(); return bitmap;
Blur.java RenderScript rs = RenderScript.create(context); Allocation in = Allocation.createFromBitmap(rs, bitmap);
Type t = in.getType(); Allocation out = Allocation.createTyped(rs, t); ScriptIntrinsicBlur script = ScriptIntrinsicBlur.create(rs, Element.U8_4(rs)); script.setRadius(radius); script.setInput(in); script.forEach(out); out.copyTo(bitmap); in.destroy(); out.destroy(); script.destroy(); rs.destroy(); return bitmap;
Blur.java RenderScript rs = RenderScript.create(context); Allocation in = Allocation.createFromBitmap(rs, bitmap);
Type t = in.getType(); Allocation out = Allocation.createTyped(rs, t); ScriptIntrinsicBlur script = ScriptIntrinsicBlur.create(rs, Element.U8_4(rs)); script.setRadius(radius); script.setInput(in); script.forEach(out); out.copyTo(bitmap); in.destroy(); out.destroy(); script.destroy(); rs.destroy(); return bitmap;
Blur.java RenderScript rs = RenderScript.create(context); Allocation in = Allocation.createFromBitmap(rs, bitmap);
Type t = in.getType(); Allocation out = Allocation.createTyped(rs, t); ScriptIntrinsicBlur script = ScriptIntrinsicBlur.create(rs, Element.U8_4(rs)); script.setRadius(radius); script.setInput(in); script.forEach(out); out.copyTo(bitmap); in.destroy(); out.destroy(); script.destroy(); rs.destroy(); return bitmap;
Blur.java RenderScript rs = RenderScript.create(context); Allocation in = Allocation.createFromBitmap(rs, bitmap);
Type t = in.getType(); Allocation out = Allocation.createTyped(rs, t); ScriptIntrinsicBlur script = ScriptIntrinsicBlur.create(rs, Element.U8_4(rs)); script.setRadius(radius); script.setInput(in); script.forEach(out); out.copyTo(bitmap); in.destroy(); out.destroy(); script.destroy(); rs.destroy(); return bitmap;
Blur.java RenderScript rs = RenderScript.create(context); Allocation in = Allocation.createFromBitmap(rs, bitmap);
Type t = in.getType(); Allocation out = Allocation.createTyped(rs, t); ScriptIntrinsicBlur script = ScriptIntrinsicBlur.create(rs, Element.U8_4(rs)); script.setRadius(radius); script.setInput(in); script.forEach(out); out.copyTo(bitmap); in.destroy(); out.destroy(); script.destroy(); rs.destroy(); return bitmap;
Blur.java RenderScript rs = RenderScript.create(context); Allocation in = Allocation.createFromBitmap(rs, bitmap);
Type t = in.getType(); Allocation out = Allocation.createTyped(rs, t); ScriptIntrinsicBlur script = ScriptIntrinsicBlur.create(rs, Element.U8_4(rs)); script.setRadius(radius); script.setInput(in); script.forEach(out); out.copyTo(bitmap); in.destroy(); out.destroy(); script.destroy(); rs.destroy(); return bitmap;
Blur.java RenderScript rs = RenderScript.create(context); Allocation in = Allocation.createFromBitmap(rs, bitmap);
Type t = in.getType(); Allocation out = Allocation.createTyped(rs, t); ScriptIntrinsicBlur script = ScriptIntrinsicBlur.create(rs, Element.U8_4(rs)); script.setRadius(radius); script.setInput(in); script.forEach(out); out.copyTo(bitmap); in.destroy(); out.destroy(); script.destroy(); rs.destroy(); return bitmap;
Blur.java RenderScript rs = RenderScript.create(context); Allocation in = Allocation.createFromBitmap(rs, bitmap);
Type t = in.getType(); Allocation out = Allocation.createTyped(rs, t); ScriptIntrinsicBlur script = ScriptIntrinsicBlur.create(rs, Element.U8_4(rs)); script.setRadius(radius); script.setInput(in); script.forEach(out); out.copyTo(bitmap); in.destroy(); out.destroy(); script.destroy(); rs.destroy(); return bitmap;
Blur.java RenderScript rs = RenderScript.create(context); Allocation in = Allocation.createFromBitmap(rs, bitmap);
Type t = in.getType(); Allocation out = Allocation.createTyped(rs, t); ScriptIntrinsicBlur script = ScriptIntrinsicBlur.create(rs, Element.U8_4(rs)); script.setRadius(radius); script.setInput(in); script.forEach(out); out.copyTo(bitmap); in.destroy(); out.destroy(); script.destroy(); rs.destroy(); return bitmap;
Blur.java RenderScript rs = RenderScript.create(context); Allocation in = Allocation.createFromBitmap(rs, bitmap);
Type t = in.getType(); Allocation out = Allocation.createTyped(rs, t); ScriptIntrinsicBlur script = ScriptIntrinsicBlur.create(rs, Element.U8_4(rs)); script.setRadius(radius); script.setInput(in); script.forEach(out); out.copyTo(bitmap); in.destroy(); out.destroy(); script.destroy(); rs.destroy(); return bitmap;
Blur.java RenderScript rs = RenderScript.create(context); Allocation in = Allocation.createFromBitmap(rs, bitmap);
Type t = in.getType(); Allocation out = Allocation.createTyped(rs, t); ScriptIntrinsicBlur script = ScriptIntrinsicBlur.create(rs, Element.U8_4(rs)); script.setRadius(radius); script.setInput(in); script.forEach(out); out.copyTo(bitmap); in.destroy(); out.destroy(); script.destroy(); rs.destroy(); return bitmap;
Blur.java RenderScript rs = RenderScript.create(context); Allocation in = Allocation.createFromBitmap(rs, bitmap);
Type t = in.getType(); Allocation out = Allocation.createTyped(rs, t); ScriptIntrinsicBlur script = ScriptIntrinsicBlur.create(rs, Element.U8_4(rs)); script.setRadius(radius); script.setInput(in); script.forEach(out); out.copyTo(bitmap); in.destroy(); out.destroy(); script.destroy(); rs.destroy(); return bitmap;
Les plus simples - ScriptIntrinsicBlur - ScriptIntrinsicResize - ScriptIntrinsicColorMatrix -
ScriptIntrinsicBlend ScriptIntrinsics
Les plus simples - ScriptIntrinsicBlur - ScriptIntrinsicResize - ScriptIntrinsicColorMatrix -
ScriptIntrinsicBlend Les moins simples - ScriptIntrinsicConvolve3x3 - ScriptIntrinsicConvolve5x5 - ScriptIntrinsicYuvToRGB - ScriptIntrinsicLUT - ScriptIntrinsic3DLUT ScriptIntrinsics
Renderscript like a boss : effet vignette à la Instagram
None
None
vignette.rs int width; int height; uchar4 __attribute__((kernel)) root(uchar4 in, uint32_t
x, uint32_t y) { float4 f4 = rsUnpackColor8888(in); float red = f4.r; float green = f4.g; float blue = f4.b; float distance = computeDistance(x, y); float4 newColor = computeColor(red, green, blue, distance); return rsPackColorTo8888(newColor.r, newColor.g, newColor.b, f4.a); }
vignette.rs int width; int height; uchar4 __attribute__((kernel)) root(uchar4 in, uint32_t
x, uint32_t y) { float4 f4 = rsUnpackColor8888(in); float red = f4.r; float green = f4.g; float blue = f4.b; float distance = computeDistance(x, y); float4 newColor = computeColor(red, green, blue, distance); return rsPackColorTo8888(newColor.r, newColor.g, newColor.b, f4.a); }
vignette.rs int width; int height; uchar4 __attribute__((kernel)) root(uchar4 in, uint32_t
x, uint32_t y) { float4 f4 = rsUnpackColor8888(in); float red = f4.r; float green = f4.g; float blue = f4.b; float distance = computeDistance(x, y); float4 newColor = computeColor(red, green, blue, distance); return rsPackColorTo8888(newColor.r, newColor.g, newColor.b, f4.a); }
vignette.rs int width; int height; uchar4 __attribute__((kernel)) root(uchar4 in, uint32_t
x, uint32_t y) { float4 f4 = rsUnpackColor8888(in); float red = f4.r; float green = f4.g; float blue = f4.b; float distance = computeDistance(x, y); float4 newColor = computeColor(red, green, blue, distance); return rsPackColorTo8888(newColor.r, newColor.g, newColor.b, f4.a); }
vignette.rs int width; int height; uchar4 __attribute__((kernel)) root(uchar4 in, uint32_t
x, uint32_t y) { float4 f4 = rsUnpackColor8888(in); float red = f4.r; float green = f4.g; float blue = f4.b; float distance = computeDistance(x, y); float4 newColor = computeColor(red, green, blue, distance); return rsPackColorTo8888(newColor.r, newColor.g, newColor.b, f4.a); }
vignette.rs int width; int height; uchar4 __attribute__((kernel)) root(uchar4 in, uint32_t
x, uint32_t y) { float4 f4 = rsUnpackColor8888(in); float red = f4.r; float green = f4.g; float blue = f4.b; float distance = computeDistance(x, y); float4 newColor = computeColor(red, green, blue, distance); return rsPackColorTo8888(newColor.r, newColor.g, newColor.b, f4.a); }
vignette.rs int width; int height; uchar4 __attribute__((kernel)) root(uchar4 in, uint32_t
x, uint32_t y) { float4 f4 = rsUnpackColor8888(in); float red = f4.r; float green = f4.g; float blue = f4.b; float distance = computeDistance(x, y); float4 newColor = computeColor(red, green, blue, distance); return rsPackColorTo8888(newColor.r, newColor.g, newColor.b, f4.a); } static float computeDistance(uint32_t x, uint32_t y) {...}
vignette.rs int width; int height; uchar4 __attribute__((kernel)) root(uchar4 in, uint32_t
x, uint32_t y) { float4 f4 = rsUnpackColor8888(in); float red = f4.r; float green = f4.g; float blue = f4.b; float distance = computeDistance(x, y); float4 newColor = computeColor(red, green, blue, distance); return rsPackColorTo8888(newColor.r, newColor.g, newColor.b, f4.a); } static float4 computeColor(...) {...}
vignette.rs int width; int height; uchar4 __attribute__((kernel)) root(uchar4 in, uint32_t
x, uint32_t y) { float4 f4 = rsUnpackColor8888(in); float red = f4.r; float green = f4.g; float blue = f4.b; float distance = computeDistance(x, y); float4 newColor = computeColor(red, green, blue, distance); return rsPackColorTo8888(newColor.r, newColor.g, newColor.b, f4.a); }
vignette.rs int width; int height; uchar4 __attribute__((kernel)) root(uchar4 in, uint32_t
x, uint32_t y) { float4 f4 = rsUnpackColor8888(in); float red = f4.r; float green = f4.g; float blue = f4.b; float distance = computeDistance(x, y); float4 newColor = computeColor(red, green, blue, distance); return rsPackColorTo8888(newColor.r, newColor.g, newColor.b, f4.a); }
Mask.java RenderScript rs = RenderScript.create(context); Allocation in = Allocation.createFromBitmap(rs, bitmap);
Type t = in.getType(); Allocation out = Allocation.createTyped(rs, t); ScriptC_vignette script = ScriptC_vignette(rs); script.setWidth(bitmap.width); script.setHeight(bitmap.height); script.forEach_root(in, out); out.copyTo(bitmap); in.destroy(); out.destroy(); script.destroy(); rs.destroy(); return bitmap;
Générations à partir du fichier .rs RenderScript ➔ Java
Générations à partir du fichier .rs script.rs ScriptC_script.java RenderScript ➔
Java
Générations à partir du fichier .rs script.rs ScriptC_script.java Typedef struct
Struct ScriptField_Struct.java RenderScript ➔ Java
Générations à partir du fichier .rs script.rs ScriptC_script.java Typedef struct
Struct ScriptField_Struct.java Struct_t* my_struct; .bind_my_struct(...); RenderScript ➔ Java
Générations à partir du fichier .rs script.rs ScriptC_script.java Typedef struct
Struct ScriptField_Struct.java Struct_t* my_struct; .bind_my_struct(...); int value; .set_value(int i); .get_value(); RenderScript ➔ Java
Générations à partir du fichier .rs script.rs ScriptC_script.java Typedef struct
Struct ScriptField_Struct.java Struct_t* my_struct; .bind_my_struct(...); int value; .set_value(int i); .get_value(); void function(); .invoke_function(); RenderScript ➔ Java
Générations à partir du fichier .rs script.rs ScriptC_script.java Typedef struct
Struct ScriptField_Struct.java Struct_t* my_struct; .bind_my_struct(...); int value; .set_value(int i); .get_value(); void function(); .invoke_function(); uchar4 __attribute__((kernel)) root(uchar4 in, uint32_t x, uint32_t y) .forEach_root(Allocation in, Allocation out); RenderScript ➔ Java
Renderscript godlike : amélioration automatique d’image
None
None
None
None
None
None
None
None
None
None
None
None
None
None
Temps de calcul Java >15 s
Temps de calcul Java >15 s Renderscript < 1s
Temps de calcul Java >15 s Renderscript < 1s 15x
plus rapide
ElevationImageView
Merci @QMenini @qhutch @qhutch