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
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.6k
About Flutter Architecture
wasabeef
1
300
2023 Flutter/Dart Summary
wasabeef
0
120
I/O Extended 2023 - Dart と Flutter の新機能
wasabeef
0
220
I/O Extended 2023 - Flutter 活用事例
wasabeef
10
3.1k
What it Takes to be a Flutter Developer
wasabeef
0
230
FlutterKaigi 2022 Keynote
wasabeef
1
670
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
The Past, Present, and Future of Enterprise Java
ivargrimstad
0
460
RubyとGoでゼロから作る証券システム: 高信頼性が求められるシステムのコードの外側にある設計と運用のリアル
free_world21
0
240
Claude Codeセッション現状確認 2026福岡 / fukuoka-aicoding-00-beacon
monochromegane
4
410
ロボットのための工場に灯りは要らない
watany
4
490
Windows on Ryzen and I
seosoft
0
220
Go Conference mini in Sendai 2026 : Goに新機能を提案し実装されるまでのフロー徹底解説
yamatoya
0
550
Agentic AI: Evolution oder Revolution
mobilelarson
PRO
0
130
Swift ConcurrencyでよりSwiftyに
yuukiw00w
0
250
「やめとこ」がなくなった — 1月にZennを始めて22本書いた AI共創開発のリアル
atani14
0
360
TipKitTips
ktcryomm
0
160
Go1.26 go fixをプロダクトに適用して困ったこと
kurakura0916
0
340
手戻りゼロ? Spec Driven Developmentとは@KAG AI week
tmhirai
1
180
Featured
See All Featured
Intergalactic Javascript Robots from Outer Space
tanoku
273
27k
My Coaching Mixtape
mlcsv
0
68
Bootstrapping a Software Product
garrettdimon
PRO
307
120k
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
12
1.1k
How to Think Like a Performance Engineer
csswizardry
28
2.5k
Discover your Explorer Soul
emna__ayadi
2
1.1k
The browser strikes back
jonoalderson
0
770
コードの90%をAIが書く世界で何が待っているのか / What awaits us in a world where 90% of the code is written by AI
rkaga
60
42k
Become a Pro
speakerdeck
PRO
31
5.8k
Fantastic passwords and where to find them - at NoRuKo
philnash
52
3.6k
We Are The Robots
honzajavorek
0
190
Dealing with People You Can't Stand - Big Design 2015
cassininazir
367
27k
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.