1 package jp
.gr
.java_conf
.ofnhwx
.olib
.utils
;
3 import java
.io
.BufferedOutputStream
;
4 import java
.io
.ByteArrayOutputStream
;
5 import java
.io
.InputStream
;
6 import java
.io
.OutputStream
;
8 import android
.content
.Context
;
9 import android
.content
.res
.Resources
;
10 import android
.graphics
.Bitmap
;
11 import android
.graphics
.BitmapFactory
;
12 import android
.graphics
.Canvas
;
13 import android
.graphics
.drawable
.BitmapDrawable
;
14 import android
.graphics
.drawable
.Drawable
;
15 import android
.net
.Uri
;
18 * ビットマップを便利に使うための自分用クラス.
21 public final class OBitmap
{
26 * Bitmapのサイズを取得するための{@link BitmapFactory.Options}を作成する.
27 * @return `<code>{@link BitmapFactory.Options#inJustDecodeBounds} = true</code>'が設定された<code>Options</code>
29 private static final BitmapFactory
.Options
createOptions() {
30 BitmapFactory
.Options opt
= new BitmapFactory
.Options();
31 opt
.inPurgeable
= true;
32 opt
.inJustDecodeBounds
= true;
37 * Bitmapをリサイズして作成するための{@link BitmapFactory.Options}を作成する.
38 * @param base {@link #createOptions()}で作成した<code>Options</code>
39 * @param max 縦(or 横)の最大サイズ
40 * @return サイズ関連の設定を行った<code>Options</code>
42 private static final BitmapFactory
.Options
createOptions(BitmapFactory
.Options base
, float max
) {
43 BitmapFactory
.Options opt
= new BitmapFactory
.Options();
44 opt
.inPurgeable
= true;
45 opt
.inInputShareable
= true;
46 opt
.inSampleSize
= (int)Math
.floor(Math
.max(base
.outHeight
, base
.outWidth
) / max
);
51 * DrawableからBitmap画像をリサイズして取得.
53 * @return Bitmap画像(drawableが'null'なら'null'を返す)
55 public static final Bitmap
getBitmap(Drawable drawable
) {
56 if (drawable
== null) {
59 if (drawable
instanceof BitmapDrawable
) {
60 return ((BitmapDrawable
)drawable
).getBitmap();
62 int w
= drawable
.getIntrinsicWidth();
63 int h
= drawable
.getIntrinsicHeight();
64 Bitmap b
= Bitmap
.createBitmap(w
, h
, Bitmap
.Config
.ARGB_4444
);
65 Canvas canvas
= new Canvas(b
);
66 drawable
.setBounds(0, 0, w
, h
);
67 drawable
.draw(canvas
);
72 * DrawableからBitmap画像をリサイズして取得.
74 * @param size リサイズ後のサイズ(幅・高さ)
75 * @return リサイズしたBitmap画像(drawableが'null'なら'null'を返す)
77 public static final Bitmap
getBitmap(Drawable drawable
, int size
) {
78 Bitmap bitmap
= getBitmap(drawable
);
79 Bitmap result
= resizeBitmap(bitmap
, size
);
88 * リソースIDからBitmap画像を生成.
90 * @param id Bitmap画像のリソースID
91 * @param max 縦・横の最大サイズ
94 private static final Bitmap
decodeResourceInternal(Context context
, int id
, int max
) {
95 Resources res
= context
.getResources();
96 BitmapFactory
.Options options
= createOptions();
97 BitmapFactory
.decodeResource(res
, id
, options
);
98 return BitmapFactory
.decodeResource(res
, id
, createOptions(options
, max
));
102 * リソースIDからBitmap画像をリサイズして取得.
104 * @param id Bitmap画像のリソースID
105 * @param width リサイズ後の幅
106 * @param height リサイズ後の高さ
107 * @return リサイズしたBitmap画像(bitmapが'null'なら'null'を返す)
109 public static final Bitmap
decodeResource(Context context
, int id
, int width
, int height
) {
110 Bitmap bitmap
= decodeResourceInternal(context
, id
, Math
.max(width
, height
));
111 Bitmap result
= resizeBitmap(bitmap
, width
, height
);
112 if (bitmap
!= null) {
120 * リソースIDからBitmap画像をリサイズして取得.
122 * @param id Bitmap画像のリソースID
123 * @param size リサイズ後のサイズ(幅・高さ)
124 * @return リサイズしたBitmap画像(bitmapが'null'なら'null'を返す)
126 public static final Bitmap
decodeResource(Context context
, int id
, int size
) {
127 Bitmap bitmap
= decodeResourceInternal(context
, id
, size
);
128 Bitmap result
= resizeBitmap(bitmap
, size
);
129 if (bitmap
!= null) {
137 * リソースIDからBitmap画像をリサイズして取得.
139 * @param id Bitmap画像のリソースID
140 * @param size リサイズ後のサイズ(幅・高さ)
141 * @param keepAspect アスペクト比を維持してリサイズするかどうか
142 * @return リサイズしたBitmap画像(bitmapが'null'なら'null'を返す)
144 public static final Bitmap
decodeResource(Context context
, int id
, int size
, boolean keepAspect
) {
145 Bitmap bitmap
= decodeResourceInternal(context
, id
, size
);
146 Bitmap result
= resizeBitmap(bitmap
, size
, keepAspect
);
147 if (bitmap
!= null) {
154 // ---------- Bitmap画像のリサイズ(バイトストリーム) ---------- //
157 * バイト配列からBitmap画像を生成.
158 * @param data Bitmap画像のバイト配列
162 private static final Bitmap
decodeByteArrayInternal(byte[] data
, float max
) {
166 BitmapFactory
.Options options
= createOptions();
167 BitmapFactory
.decodeByteArray(data
, 0, data
.length
, options
);
168 return BitmapFactory
.decodeByteArray(data
, 0, data
.length
, createOptions(options
, max
));
172 * バイト配列からBitmap画像をリサイズして取得.
173 * @param data Bitmap画像のバイト配列
174 * @param width リサイズ後の幅
175 * @param height リサイズ後の高さ
176 * @return リサイズしたBitmap画像(bitmapが'null'なら'null'を返す)
178 public static final Bitmap
decodeByteArray(byte[] data
, int width
, int height
) {
179 Bitmap bitmap
= decodeByteArrayInternal(data
, Math
.max(width
, height
));
180 Bitmap result
= resizeBitmap(bitmap
, width
, height
);
181 if (bitmap
!= null) {
189 * バイト配列からBitmap画像をリサイズして取得.
190 * @param data Bitmap画像のバイト配列
191 * @param size リサイズ後のサイズ(幅・高さ)
192 * @return リサイズしたBitmap画像(bitmapが'null'なら'null'を返す)
194 public static final Bitmap
decodeByteArray(byte[] data
, int size
) {
195 Bitmap bitmap
= decodeByteArrayInternal(data
, size
);
196 Bitmap result
= resizeBitmap(bitmap
, size
);
197 if (bitmap
!= null) {
205 * バイト配列からBitmap画像をリサイズして取得.
206 * @param data Bitmap画像のバイト配列
207 * @param size リサイズ後のサイズ(幅・高さ)
208 * @param keepAspect アスペクト比を維持してリサイズするかどうか
209 * @return リサイズしたBitmap画像(bitmapが'null'なら'null'を返す)
211 public static final Bitmap
decodeByteArray(byte[] data
, int size
, boolean keepAspect
) {
212 Bitmap bitmap
= decodeByteArrayInternal(data
, size
);
213 Bitmap result
= resizeBitmap(bitmap
, size
, keepAspect
);
214 if (bitmap
!= null) {
222 * Uriの指定する内容をバイト配列に格納して返す.
226 private static final byte[] getBytesInternal(Context context
, Uri uri
) {
227 ByteArrayOutputStream result
= new ByteArrayOutputStream();
228 OutputStream os
= new BufferedOutputStream(result
);
229 InputStream is
= null;
232 is
= context
.getContentResolver().openInputStream(uri
);
233 while ((c
= is
.read()) != -1) {
237 } catch (Exception e
) {
242 } catch (Exception e
) {
245 return result
.toByteArray();
249 * UriからBitmap画像をリサイズして取得.
252 * @param width リサイズ後の幅
253 * @param height リサイズ後の高さ
254 * @return リサイズしたBitmap画像(bitmapが'null'なら'null'を返す)
256 public static final Bitmap
decodeUri(Context context
, Uri uri
, int width
, int height
) {
257 byte[] bitmap
= getBytesInternal(context
, uri
);
258 return decodeByteArray(bitmap
, width
, height
);
262 * UriからBitmap画像をリサイズして取得.
265 * @param size リサイズ後のサイズ(幅・高さ)
266 * @return リサイズしたBitmap画像(bitmapが'null'なら'null'を返す)
268 public static final Bitmap
decodeUri(Context context
, Uri uri
, int size
) {
269 byte[] bitmap
= getBytesInternal(context
, uri
);
270 return decodeByteArray(bitmap
, size
);
274 * UriからBitmap画像をリサイズして取得.
277 * @param size リサイズ後のサイズ(幅・高さ)
278 * @param keepAspect アスペクト比を維持してリサイズするかどうか
279 * @return リサイズしたBitmap画像(bitmapが'null'なら'null'を返す)
281 public static final Bitmap
decodeUri(Context context
, Uri uri
, int size
, boolean keepAspect
) {
282 byte[] bitmap
= getBytesInternal(context
, uri
);
283 return decodeByteArray(bitmap
, size
, keepAspect
);
288 * @param bitmap リサイズするBitmap画像
289 * @param width リサイズ後の幅
290 * @param height リサイズ後の高さ
291 * @return リサイズしたBitmap画像(bitmapが'null'なら'null'を返す)
293 public static final Bitmap
resizeBitmap(Bitmap bitmap
, int width
, int height
) {
294 if (bitmap
== null) {
298 int w
= bitmap
.getWidth();
299 int h
= bitmap
.getHeight();
300 if (w
== width
&& h
== height
) {
304 return Bitmap
.createScaledBitmap(bitmap
, width
, height
, true);
309 * @param bitmap リサイズするBitmap画像
310 * @param size リサイズ後のサイズ(幅・高さ)
311 * @return リサイズしたBitmap画像(bitmapが'null'なら'null'を返す)
313 public static final Bitmap
resizeBitmap(Bitmap bitmap
, int size
) {
314 return resizeBitmap(bitmap
, size
, size
);
319 * @param bitmap リサイズするBitmap画像
320 * @param size リサイズ後のサイズ(幅・高さ)
321 * @param keepAspect アスペクト比を維持してリサイズするかどうか
322 * @return リサイズしたBitmap画像(bitmapが'null'なら'null'を返す)
324 public static final Bitmap
resizeBitmap(Bitmap bitmap
, int size
, boolean keepAspect
) {
325 if (bitmap
== null) {
329 int width
= bitmap
.getWidth();
330 int height
= bitmap
.getHeight();
331 if (width
== height
|| !keepAspect
) {
332 return resizeBitmap(bitmap
, size
, size
);
333 } else if (width
> height
) {
334 return resizeBitmap(bitmap
, size
, size
* height
/ width
);
335 } else if (width
< height
) {
336 return resizeBitmap(bitmap
, size
* width
/ height
, size
);