Upgrade to PRO for Only $50/Year—Limited-Time Offer! 🔥
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Android - Bitmapは怖くない
Search
Daichi Furiya (Wasabeef)
April 25, 2015
Programming
10
18k
Android - Bitmapは怖くない
Bitmapってどういうことが出来るか
・Picasso, GlideでのTransformationについて
・Frescoとは?
・GPUImage for Android
Daichi Furiya (Wasabeef)
April 25, 2015
Tweet
Share
More Decks by Daichi Furiya (Wasabeef)
See All by Daichi Furiya (Wasabeef)
DevFest Tokyo 2025 - Flutter のアプリアーキテクチャ現在地点
wasabeef
6
2.4k
About Flutter Architecture
wasabeef
1
290
2023 Flutter/Dart Summary
wasabeef
0
99
I/O Extended 2023 - Dart と Flutter の新機能
wasabeef
0
200
I/O Extended 2023 - Flutter 活用事例
wasabeef
10
3k
What it Takes to be a Flutter Developer
wasabeef
0
210
FlutterKaigi 2022 Keynote
wasabeef
1
650
Flutter Hooks を使ったアプリ開発 / App Development with the Flutter Hooks
wasabeef
2
1.5k
Flutter 2021 の振り返りと今後のアプリ開発に向けて / Looking back on Flutter 2021 and for future app development.
wasabeef
4
2.2k
Other Decks in Programming
See All in Programming
Tinkerbellから学ぶ、Podで DHCPをリッスンする手法
tomokon
0
130
Rubyで鍛える仕組み化プロヂュース力
muryoimpl
0
140
Cap'n Webについて
yusukebe
0
130
Developing static sites with Ruby
okuramasafumi
0
300
AIコーディングエージェント(NotebookLM)
kondai24
0
200
Full-Cycle Reactivity in Angular: SignalStore mit Signal Forms und Resources
manfredsteyer
PRO
0
140
Cell-Based Architecture
larchanjo
0
130
モデル駆動設計をやってみようワークショップ開催報告(Modeling Forum2025) / model driven design workshop report
haru860
0
270
Flutter On-device AI로 완성하는 오프라인 앱, 박제창 @DevFest INCHEON 2025
itsmedreamwalker
1
110
Claude Codeの「Compacting Conversation」を体感50%減! CLAUDE.md + 8 Skills で挑むコンテキスト管理術
kmurahama
0
280
実はマルチモーダルだった。ブラウザの組み込みAI🧠でWebの未来を感じてみよう #jsfes #gemini
n0bisuke2
3
1.2k
Giselleで作るAI QAアシスタント 〜 Pull Requestレビューに継続的QAを
codenote
0
210
Featured
See All Featured
Speed Design
sergeychernyshev
33
1.4k
[SF Ruby Conf 2025] Rails X
palkan
0
540
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
254
22k
The Cost Of JavaScript in 2023
addyosmani
55
9.4k
Thoughts on Productivity
jonyablonski
73
5k
Git: the NoSQL Database
bkeepers
PRO
432
66k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
32
1.8k
It's Worth the Effort
3n
187
29k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
31
3k
The MySQL Ecosystem @ GitHub 2015
samlambert
251
13k
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
47
7.9k
Bootstrapping a Software Product
garrettdimon
PRO
307
120k
Transcript
Bitmapා͘ͳ͍ Wasabeef
About Me wasabeef CyberAgent, Inc.
Ͳ͏ߟ͑ͯBitmapා͍Ͱ͢
OutOfMemoryError…
About Bitmap
Bitmap • ը૾Λѻ͏جຊతͳAPI • BitmapFactoryͰΦϒδΣΫτੜ͢Δ • OutOfMemoryΛى͜͢ݪҼʹͳΓ͍͢
Supported Image Formats Format Encoder Decoder Details File Type JPEG
! ! Base+Progressive .jpg GIF ! .gif PNG ! ! .png BMP ! .bmp WebP !# 4.0+ !# 4.0+ .webp
About BitmapFactory.Options
inJustDecodeBounds • Bitmapͷϝλใ͚ͩऔಘ • ͋Β͔͡Ίը૾αΠζ͚ͩऔಘ͢Δ߹ͳͲ
inSampleSize • σϑΥϧτ1 • 2ʹઃఆ͢Δͱ1/2αΠζ • 4ʹઃఆ͢Δͱ1/4αΠζ • BitmapʹFilter͔͚Δ࣌ʹͱͯ༗ޮ
inPreferredConfig • BitmapΛಡΈࠐΉFormatΛࢦఆ͢Δ • σϑΥϧτ Bitmap.Config.ARGB_8888
About Bitmap.Config
ARGB_8888 • 32bit • Alpha, Red, Green, Blue ֤8bit •
Default
ARGB_4444 • 16bit • Alpha, Red, Green, Blue ֤4bit •
Deprecated in API 13
RGB_565 • 16bit • Alpha͕ͳ͍ը૾ʹ༗ޮ • ߹ʹΑͬͯARGB_8888ͷۙ͘
ALPHA_8 • 8bit • AlphaͷΈͷ߹ʹ༗ޮ
Open Source
Open Source • Universal Image Loader • Picasso • Glide
• Fresco • Volley
Picasso by Square
Picasso • Image Library • Transformation • Cache • Save
the world
Picasso Picasso.with(this) .load(“http://i.imgur.com/4rBHm4Q.jpg”) .transform(new CircleTransform()) .into(imageView);
Picasso .fit()
Picasso .centerCrop()
Picasso .resize(800,800).centerInside()
Glide by Bump (sjudd)
Glide • Picasso like • Video, Gif support • Sampling
support • BitmapPool • Thumbnail change the world
Glide Glide.with(this) .load(“http://i.imgur.com/4rBHm4Q.jpg”) .transform(new CircleTransform()) .into(imageView); #
.fitCenter() Glide
.centerCrop() Glide
.override(800, 800) Glide
Picasso and Glide Transform
Transform ը૾ΛಡΈࠐΜͰImageViewʹ දࣔ͢Δલʹը૾Λมܗͤ͞Δ
RoundedCorners
CropCircle
BitmapShader
BitmapShader public static Bitmap shader(Bitmap src) { int width =
src.getWidth(); int height = src.getHeight(); # bitmap = Bitmap.createBitmap(width, height, config); # Canvas canvas = new Canvas(bitmap); Paint paint = new Paint(); paint.setAntiAlias(true); BitmapShader shader = new BitmapShader( src, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP); # paint.setShader(shader); RectF rectF = new RectF(margin, margin, width - margin, height - margin); canvas.drawRoundRect(recfF, radius, radius, paint); # return bitmap; }
Blur
RenderScript
RenderScript ScriptIntrinsicBlur public static Bitmap blur(Bitmap src) { int width
= src.getWidth(); int height = src.getHeight(); # bitmap = Bitmap.createBitmap(width, height, config); RenderScript rs = RenderScript.create(mContext); Allocation alloc = Allocation.createFromBitmap(rs, src); ScriptIntrinsicBlur blur = ScriptIntrinsicBlur.create(rs, alloc.getElement()); blur.setInput(alloc); blur.setRadius(mRadius); blur.forEach(alloc); alloc.copyTo(bitmap); source.recycle(); # return bitmap; }
ColorFilter
ColorFilter
ColorFilter public static Bitmap color(Bitmap src, int color) { int
width = src.getWidth(); int height = src.getHeight(); # bitmap = Bitmap.createBitmap(width, height, config); Canvas canvas = new Canvas(bitmap); Paint paint = new Paint(); paint.setAntiAlias(true); PorterDuffColorFilter filter = new PorterDuffColorFilter(color, PorterDuff.Mode.SRC_ATOP); paint.setColorFilter(filter); canvas.drawBitmap(src, 0, 0, paint); # return bitmap; }
Open Source
Transform • picasso-transformations • glide-transformations wasabeef
GPUImage for Android CyberAgent, Inc.
GPUImage for Android • iOSͷGPUImageΛݩʹAndroidʹҠ২ • ImageViewʹରͯ͠FilterΛ͔͚ΕΔ • Filterͷछྨ70ݸ •
PhotoshopͷACVʹରԠ • API 8 (2.2+)
GPUImage for Android @Override public void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState); setContentView(R.layout.activity); # Uri imageUri = Uri.parse(“http://i.imgur.com/4rBHm4Q.jpg”); mGPUImage = new GPUImage(this); mGPUImage.setImage(imageUri); mGPUImage.setFilter(new GPUImageToonFilter()); # mGPUImage.saveToPictures(mGPUImage, “sample.jpg”, null); }
Fresco by Facebook
Fresco • streaming of progressive JPEGs • Gif, WebP support
• Loading customization
Fresco <com.facebook.drawee.view.SimpleDraweeView android:id="@+id/my_image_view" android:layout_width="200dp" android:layout_height="200dp" fresco:fadeDuration="300" fresco:actualImageScaleType="focusCrop" fresco:placeholderImage="@color/wait_color" fresco:placeholderImageScaleType="fitCenter" fresco:failureImage="@drawable/error"
fresco:failureImageScaleType="centerInside" fresco:retryImage="@drawable/retrying" fresco:retryImageScaleType="centerCrop" fresco:progressBarImage="@drawable/progress_bar" fresco:progressBarImageScaleType="centerInside" fresco:progressBarAutoRotateInterval="1000" fresco:backgroundImage="@color/blue" fresco:overlayImage="@drawable/watermark" fresco:pressedStateOverlayImage="@color/red" fresco:roundAsCircle="false" fresco:roundedCornerRadius="1dp" fresco:roundTopLeft="true" fresco:roundTopRight="false" fresco:roundBottomLeft="false" fresco:roundBottomRight="true" fresco:roundWithOverlayColor="@color/corner_color" fresco:roundingBorderWidth="2dp" fresco:roundingBorderColor=“@color/border_color"/>
OutOfMemoryError
࠷ޙͷखஈ
android:largeHeap=“true"
largeHeap == true? • Google+ • Amazon Kindle • Facebook
• Hulu • Tumblr • Youtube • Ameba Ownd
Wasabeef
Thanks.