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
仕様書を書く前にハーネスを作る - Agent Native開発は「探索を速く、判定を固く」
gotalab555
4
1.5k
Android CLI
fornewid
0
210
AI Engineeringは、AIプロダクトだけのものか? 〜AIがソフトウェアを作る時代の新しい当たり前〜 / No AI in your product. AI Engineering in your development.
rkaga
4
380
Foundation Models frameworkで画像分析
ryodeveloper
1
590
the container ship “Apple Silicon”@WWDC26 Recap -Japan-\(region).swift
shingangan
0
110
その節約、円になってますか?
isamumumu
1
690
yield再入門 #phpcon
o0h
PRO
0
960
アルゴリズムは何を圧縮しているのか ─ Haskell から育った「圧縮代数」というメンタルモデル
naoya
16
3.9k
VibeCodingからAgenticWorkflowへ
starfish719
0
280
言語を使う側から、作る側へ。 自作 Lisp で得た新たな気づき。
andpad
0
150
AWS CDK を「作」ってみた 〜フルスクラッチで見えた CDK の裏側〜 / aws-cdk-from-scratch
gotok365
3
2.8k
変わらないものが、変わるものを決める — 意図駆動開発 × イベントソーシング × イミュータブル | What Doesn't Change Decides What Can — IDD × Event Sourcing × Immutability
tomohisa
0
1.3k
Featured
See All Featured
SEO for Brand Visibility & Recognition
aleyda
0
4.7k
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
21
1.6k
HDC tutorial
michielstock
2
780
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
133
19k
Future Trends and Review - Lecture 12 - Web Technologies (1019888BNR)
signer
PRO
0
3.7k
WCS-LA-2024
lcolladotor
0
790
Navigating the Design Leadership Dip - Product Design Week Design Leaders+ Conference 2024
apolaine
1
390
How to train your dragon (web standard)
notwaldorf
97
6.7k
Highjacked: Video Game Concept Design
rkendrick25
PRO
1
430
New Earth Scene 8
popppiees
3
2.5k
Why Your Marketing Sucks and What You Can Do About It - Sophie Logan
marketingsoph
0
360
Optimising Largest Contentful Paint
csswizardry
37
3.9k
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