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
AWS CDK を「作」ってみた 〜フルスクラッチで見えた CDK の裏側〜 / aws-cdk-from-scratch
gotok365
3
2.8k
jsmini JavaScript Engine を作ってみた話
yosuke_furukawa
PRO
0
290
GDG Korea Android: 2026 I/O Extended ~ What's new in Android development tools
pluu
0
210
AI時代のPHPer生存戦略 ~「言語、もうなんでもよくない?」に本気で向き合う~
vivion
0
240
the container ship “Apple Silicon”@WWDC26 Recap -Japan-\(region).swift
shingangan
0
110
仕様書を書く前にハーネスを作る - Agent Native開発は「探索を速く、判定を固く」
gotalab555
4
1.5k
使いながら育てる Claude Code — 開発フローの1コマンド化 × 繰り返し指摘の自動仕組み化
shiki_kakaku
0
1.7k
React本体のコードリーディング
high_g_engineer
1
140
型も通る、synthも通る、それでも危ない 〜AIのCDKの権限とコストを機械で検証する〜 / It Passes Type Checks, It Passes Synth Checks, but It’s Still Risky — Automatically Verifying Permissions and Costs in AI’s CDK —
seike460
PRO
1
530
わからない話を追いかけたら、プログラミング言語を作る側にいた
ydah
3
460
継続モナドとリアクティブプログラミング
yukikurage
3
690
仕様駆動開発へのトライを機に チームに適合する手法を模索し続けている話
freee
PRO
0
430
Featured
See All Featured
Darren the Foodie - Storyboard
khoart
PRO
3
3.5k
For a Future-Friendly Web
brad_frost
183
10k
Why Your Marketing Sucks and What You Can Do About It - Sophie Logan
marketingsoph
0
360
The browser strikes back
jonoalderson
0
1.5k
Google's AI Overviews - The New Search
badams
0
1.1k
DBのスキルで生き残る技術 - AI時代におけるテーブル設計の勘所
soudai
PRO
68
56k
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
4.5k
[SF Ruby Conf 2025] Rails X
palkan
2
1.2k
The Cost Of JavaScript in 2023
addyosmani
55
10k
The untapped power of vector embeddings
frankvandijk
2
1.8k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
32
3k
The Hidden Cost of Media on the Web [PixelPalooza 2025]
tammyeverts
2
430
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