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
Traitement d'image simple et rapide avec Rende...
Search
Quentin Menini
April 24, 2018
Programming
650
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
Developing with AI Agents — Codex, Claude Code & Cowork Practical Guide
x5gtrn
PRO
0
1.3k
AIキャラアプリkaiwaの低遅延音声通話基盤をどう作ったか - AWS Gravitonで支える低遅延・低コストAI Agent基盤
mogamit
0
160
過去最大のMCPアップデート! 2026-07-28 RC版の謎に迫る
licux
6
450
才能?センス?知らん、 続けたもん勝ちだ。-- 結婚・出産・癌を越えてなお、私がプロダクトを創り続ける理由
16bitidol
2
740
技術記事、 専門家としてのプログラマ、 言語化
mizchi
14
7.3k
音楽のための関数型プログラミング言語mimiumにおける多段階計算の活用
tomoyanonymous
1
240
ローカルLLMでどこまでコードが書けるか -拡張版 / How much code can be written on a local LLM Extended
kishida
12
4.6k
そのテスト、説明できますか?~LWテスト戦略FW~のご紹介
nakahara
0
190
Contextとはなにか
chiroruxx
1
390
「正の参照」と 「負の導出」で組む ハーネスエンジニアリング
cottpan
1
120
Language Server 使ってる? 〜VSCode と Zed の場合〜 / Are you using a Language Server? ~For VS Code and Zed~
handlename
0
830
自作OSでスライド発表する
uyuki234
1
3.6k
Featured
See All Featured
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
16
2k
A Modern Web Designer's Workflow
chriscoyier
698
190k
How to Align SEO within the Product Triangle To Get Buy-In & Support - #RIMC
aleyda
2
1.6k
The World Runs on Bad Software
bkeepers
PRO
72
12k
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
28
3.5k
What Being in a Rock Band Can Teach Us About Real World SEO
427marketing
0
1k
Measuring & Analyzing Core Web Vitals
bluesmoon
9
880
From π to Pie charts
rasagy
0
230
Utilizing Notion as your number one productivity tool
mfonobong
4
340
A Guide to Academic Writing Using Generative AI - A Workshop
ks91
PRO
1
340
職位にかかわらず全員がリーダーシップを発揮するチーム作り / Building a team where everyone can demonstrate leadership regardless of position
madoxten
62
55k
AI: The stuff that nobody shows you
jnunemaker
PRO
8
770
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