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 options
= new BitmapFactory
.Options();
31 options
.inPurgeable
= true;
32 options
.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 options
= new BitmapFactory
.Options();
44 options
.inPurgeable
= true;
45 options
.inInputShareable
= true;
46 options
.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 width
= drawable
.getIntrinsicWidth();
63 int height
= drawable
.getIntrinsicHeight();
64 Bitmap bitmap
= Bitmap
.createBitmap(width
, height
, Bitmap
.Config
.ARGB_4444
);
65 Canvas canvas
= new Canvas(bitmap
);
66 drawable
.setBounds(0, 0, width
, height
);
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 return resizeBitmap(getBitmap(drawable
), size
);
82 * リソースIDからBitmap画像を生成.
84 * @param id Bitmap画像のリソースID
85 * @param max 縦・横の最大サイズ
88 private static final Bitmap
decodeResourceInternal(Context context
, int id
, int max
) {
89 Resources res
= context
.getResources();
90 BitmapFactory
.Options options
= createOptions();
91 BitmapFactory
.decodeResource(res
, id
, options
);
92 return BitmapFactory
.decodeResource(res
, id
, createOptions(options
, max
));
96 * リソースIDからBitmap画像をリサイズして取得.
98 * @param id Bitmap画像のリソースID
99 * @param width リサイズ後の幅
100 * @param height リサイズ後の高さ
101 * @return リサイズしたBitmap画像(bitmapが'null'なら'null'を返す)
103 public static final Bitmap
decodeResource(Context context
, int id
, int width
, int height
) {
104 Bitmap bitmap
= decodeResourceInternal(context
, id
, Math
.max(width
, height
));
105 return resizeBitmap(bitmap
, width
, height
);
109 * リソースIDからBitmap画像をリサイズして取得.
111 * @param id Bitmap画像のリソースID
112 * @param size リサイズ後のサイズ(幅・高さ)
113 * @return リサイズしたBitmap画像(bitmapが'null'なら'null'を返す)
115 public static final Bitmap
decodeResource(Context context
, int id
, int size
) {
116 Bitmap bitmap
= decodeResourceInternal(context
, id
, size
);
117 return resizeBitmap(bitmap
, size
);
121 * リソースIDからBitmap画像をリサイズして取得.
123 * @param id Bitmap画像のリソースID
124 * @param size リサイズ後のサイズ(幅・高さ)
125 * @param keepAspect アスペクト比を維持してリサイズするかどうか
126 * @return リサイズしたBitmap画像(bitmapが'null'なら'null'を返す)
128 public static final Bitmap
decodeResource(Context context
, int id
, int size
, boolean keepAspect
) {
129 Bitmap bitmap
= decodeResourceInternal(context
, id
, size
);
130 return resizeBitmap(bitmap
, size
, keepAspect
);
133 // ---------- Bitmap画像のリサイズ(バイトストリーム) ---------- //
136 * バイト配列からBitmap画像を生成.
137 * @param data Bitmap画像のバイト配列
141 private static final Bitmap
decodeByteArrayInternal(byte[] data
, float max
) {
145 BitmapFactory
.Options options
= createOptions();
146 BitmapFactory
.decodeByteArray(data
, 0, data
.length
, options
);
147 return BitmapFactory
.decodeByteArray(data
, 0, data
.length
, createOptions(options
, max
));
151 * バイト配列からBitmap画像をリサイズして取得.
152 * @param data Bitmap画像のバイト配列
153 * @param width リサイズ後の幅
154 * @param height リサイズ後の高さ
155 * @return リサイズしたBitmap画像(bitmapが'null'なら'null'を返す)
157 public static final Bitmap
decodeByteArray(byte[] data
, int width
, int height
) {
158 Bitmap bitmap
= decodeByteArrayInternal(data
, Math
.max(width
, height
));
159 return resizeBitmap(bitmap
, width
, height
);
163 * バイト配列からBitmap画像をリサイズして取得.
164 * @param data Bitmap画像のバイト配列
165 * @param size リサイズ後のサイズ(幅・高さ)
166 * @return リサイズしたBitmap画像(bitmapが'null'なら'null'を返す)
168 public static final Bitmap
decodeByteArray(byte[] data
, int size
) {
169 Bitmap bitmap
= decodeByteArrayInternal(data
, size
);
170 return resizeBitmap(bitmap
, size
);
174 * バイト配列からBitmap画像をリサイズして取得.
175 * @param data Bitmap画像のバイト配列
176 * @param size リサイズ後のサイズ(幅・高さ)
177 * @param keepAspect アスペクト比を維持してリサイズするかどうか
178 * @return リサイズしたBitmap画像(bitmapが'null'なら'null'を返す)
180 public static final Bitmap
decodeByteArray(byte[] data
, int size
, boolean keepAspect
) {
181 Bitmap bitmap
= decodeByteArrayInternal(data
, size
);
182 return resizeBitmap(bitmap
, size
, keepAspect
);
186 * Uriの指定する内容をバイト配列に格納して返す.
190 private static final byte[] getBytesInternal(Context context
, Uri uri
) {
191 ByteArrayOutputStream result
= new ByteArrayOutputStream();
192 OutputStream os
= new BufferedOutputStream(result
);
193 InputStream is
= null;
196 is
= context
.getContentResolver().openInputStream(uri
);
197 while ((c
= is
.read()) != -1) {
201 } catch (Exception e
) {
204 try { is
.close(); } catch (Exception e
) {}
205 try { os
.close(); } catch (Exception e
) {} // 実際はいらないと思う
207 return result
.toByteArray();
211 * UriからBitmap画像をリサイズして取得.
214 * @param width リサイズ後の幅
215 * @param height リサイズ後の高さ
216 * @return リサイズしたBitmap画像(bitmapが'null'なら'null'を返す)
218 public static final Bitmap
decodeUri(Context context
, Uri uri
, int width
, int height
) {
219 byte[] bitmap
= getBytesInternal(context
, uri
);
220 return decodeByteArray(bitmap
, width
, height
);
224 * UriからBitmap画像をリサイズして取得.
227 * @param size リサイズ後のサイズ(幅・高さ)
228 * @return リサイズしたBitmap画像(bitmapが'null'なら'null'を返す)
230 public static final Bitmap
decodeUri(Context context
, Uri uri
, int size
) {
231 byte[] bitmap
= getBytesInternal(context
, uri
);
232 return decodeByteArray(bitmap
, size
);
236 * UriからBitmap画像をリサイズして取得.
239 * @param size リサイズ後のサイズ(幅・高さ)
240 * @param keepAspect アスペクト比を維持してリサイズするかどうか
241 * @return リサイズしたBitmap画像(bitmapが'null'なら'null'を返す)
243 public static final Bitmap
decodeUri(Context context
, Uri uri
, int size
, boolean keepAspect
) {
244 byte[] bitmap
= getBytesInternal(context
, uri
);
245 return decodeByteArray(bitmap
, size
, keepAspect
);
250 * @param bitmap リサイズするBitmap画像
251 * @param width リサイズ後の幅
252 * @param height リサイズ後の高さ
253 * @return リサイズしたBitmap画像(bitmapが'null'なら'null'を返す)
255 public static final Bitmap
resizeBitmap(Bitmap bitmap
, int width
, int height
) {
256 if (bitmap
== null) {
260 int w
= bitmap
.getWidth();
261 int h
= bitmap
.getHeight();
262 if (w
== width
&& h
== height
) {
266 return Bitmap
.createScaledBitmap(bitmap
, width
, height
, true);
271 * @param bitmap リサイズするBitmap画像
272 * @param size リサイズ後のサイズ(幅・高さ)
273 * @return リサイズしたBitmap画像(bitmapが'null'なら'null'を返す)
275 public static final Bitmap
resizeBitmap(Bitmap bitmap
, int size
) {
276 return resizeBitmap(bitmap
, size
, size
);
281 * @param bitmap リサイズするBitmap画像
282 * @param size リサイズ後のサイズ(幅・高さ)
283 * @param keepAspect アスペクト比を維持してリサイズするかどうか
284 * @return リサイズしたBitmap画像(bitmapが'null'なら'null'を返す)
286 public static final Bitmap
resizeBitmap(Bitmap bitmap
, int size
, boolean keepAspect
) {
287 if (bitmap
== null) {
291 int width
= bitmap
.getWidth();
292 int height
= bitmap
.getHeight();
293 if (width
== height
|| !keepAspect
) {
294 return resizeBitmap(bitmap
, size
, size
);
295 } else if (width
> height
) {
296 return resizeBitmap(bitmap
, size
, size
* height
/ width
);
297 } else if (width
< height
) {
298 return resizeBitmap(bitmap
, size
* width
/ height
, size
);