さらに改善、したつもり
[ofnhwx.olib.git] / src / jp / gr / java_conf / ofnhwx / olib / utils / OBitmap.java
blob7efdafc1194349dd4b05c84e8c382d2632e2a859
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 options = new BitmapFactory.Options();
31 options.inPurgeable = true;
32 options.inJustDecodeBounds = true;
33 return options;
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 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);
47 return options;
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 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);
68 return bitmap;
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 return resizeBitmap(getBitmap(drawable), size);
81 /**
82 * リソースIDからBitmap画像を生成.
83 * @param context
84 * @param id Bitmap画像のリソースID
85 * @param max 縦・横の最大サイズ
86 * @return Bitmap画像
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));
95 /**
96 * リソースIDからBitmap画像をリサイズして取得.
97 * @param context
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画像をリサイズして取得.
110 * @param context
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画像をリサイズして取得.
122 * @param context
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画像のバイト配列
138 * @param max
139 * @return Bitmap画像
141 private static final Bitmap decodeByteArrayInternal(byte[] data, float max) {
142 if (data == null) {
143 return null;
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の指定する内容をバイト配列に格納して返す.
187 * @param context
188 * @return
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;
194 try {
195 int c;
196 is = context.getContentResolver().openInputStream(uri);
197 while ((c = is.read()) != -1) {
198 os.write(c);
200 os.flush();
201 } catch (Exception e) {
202 return null;
203 } finally {
204 try { is.close(); } catch (Exception e) {}
205 try { os.close(); } catch (Exception e) {} // 実際はいらないと思う
207 return result.toByteArray();
211 * UriからBitmap画像をリサイズして取得.
212 * @param context
213 * @param uri
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画像をリサイズして取得.
225 * @param context
226 * @param uri
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画像をリサイズして取得.
237 * @param context
238 * @param uri
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);
249 * Bitmap画像のリサイズ.
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) {
257 return null;
259 // リサイズ前のチェック
260 int w = bitmap.getWidth();
261 int h = bitmap.getHeight();
262 if (w == width && h == height) {
263 return bitmap;
265 // リサイズ
266 return Bitmap.createScaledBitmap(bitmap, width, height, true);
270 * Bitmap画像のリサイズ.
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);
280 * Bitmap画像のリサイズ.
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) {
288 return null;
290 // アスペクト比関連でいろいろと作業
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);
300 return null;