いくつか修正
[ofnhwx.olib.git] / src / jp / gr / java_conf / ofnhwx / olib / utils / OBitmap.java
blobe5707f13d5b2f0335577bbfca6f3dd6a89617103
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;
17 /**
18 * ビットマップを便利に使うための自分用クラス.
19 * @author yuta
21 public final class OBitmap {
23 private OBitmap() {}
25 /**
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;
33 return opt;
36 /**
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);
47 return opt;
50 /**
51 * DrawableからBitmap画像をリサイズして取得.
52 * @param drawable
53 * @return Bitmap画像(drawableが'null'なら'null'を返す)
55 public static final Bitmap getBitmap(Drawable drawable) {
56 if (drawable == null) {
57 return 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);
68 return b;
71 /**
72 * DrawableからBitmap画像をリサイズして取得.
73 * @param drawable
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);
80 if (bitmap != null) {
81 bitmap.recycle();
82 bitmap = null;
84 return result;
87 /**
88 * リソースIDからBitmap画像を生成.
89 * @param context
90 * @param id Bitmap画像のリソースID
91 * @param max 縦・横の最大サイズ
92 * @return Bitmap画像
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画像をリサイズして取得.
103 * @param context
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) {
113 bitmap.recycle();
114 bitmap = null;
116 return result;
120 * リソースIDからBitmap画像をリサイズして取得.
121 * @param context
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) {
130 bitmap.recycle();
131 bitmap = null;
133 return result;
137 * リソースIDからBitmap画像をリサイズして取得.
138 * @param context
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) {
148 bitmap.recycle();
149 bitmap = null;
151 return result;
154 // ---------- Bitmap画像のリサイズ(バイトストリーム) ---------- //
157 * バイト配列からBitmap画像を生成.
158 * @param data Bitmap画像のバイト配列
159 * @param max
160 * @return Bitmap画像
162 private static final Bitmap decodeByteArrayInternal(byte[] data, float max) {
163 if (data == null) {
164 return null;
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) {
182 bitmap.recycle();
183 bitmap = null;
185 return result;
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) {
198 bitmap.recycle();
199 bitmap = null;
201 return result;
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) {
215 bitmap.recycle();
216 bitmap = null;
218 return result;
222 * Uriの指定する内容をバイト配列に格納して返す.
223 * @param context
224 * @return
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;
230 try {
231 int c;
232 is = context.getContentResolver().openInputStream(uri);
233 while ((c = is.read()) != -1) {
234 os.write(c);
236 os.flush();
237 } catch (Exception e) {
238 return null;
239 } finally {
240 try {
241 is.close();
242 } catch (Exception e) {
245 return result.toByteArray();
249 * UriからBitmap画像をリサイズして取得.
250 * @param context
251 * @param uri
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画像をリサイズして取得.
263 * @param context
264 * @param uri
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画像をリサイズして取得.
275 * @param context
276 * @param uri
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);
287 * Bitmap画像のリサイズ.
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) {
295 return null;
297 // リサイズ前のチェック
298 int w = bitmap.getWidth();
299 int h = bitmap.getHeight();
300 if (w == width && h == height) {
301 return bitmap;
303 // リサイズ
304 return Bitmap.createScaledBitmap(bitmap, width, height, true);
308 * Bitmap画像のリサイズ.
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);
318 * Bitmap画像のリサイズ.
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) {
326 return null;
328 // アスペクト比関連でいろいろと作業
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);
338 return null;