androidでBitmapを回転するには、Bitmap.createBitmapを使います。Bitmap.createBitmapについて、回転角度、filter引数、処理時間について、説明します。
Bitmap.createBitmap
androidでBitmapを回転するには、Bitmap.createBitmapを使います。
public static Bitmap createBitmap (Bitmap source,
int x,
int y,
int width,
int height,
Matrix m,
boolean filter)
Code language: Java (java)
回転は、Matrix mで指定します。
回転角が90度、180度、270度の場合は、最後の引数filterをfalseにします。
その他の回転角の場合は、状況によって、引数filterをtrue/falseを使い分けます。
多くの状況で、回転の処理時間は、ARGB_8888のほうが速いです。
拡大縮小や平行移動の処理時間は測定していません。
回転角が90度、180度、270度
引数filterがtrueでもfalseでも、回転後の画像は同じです。ところが、filterをtrueにすると、処理時間が1.5〜3倍長くなるので、filterはfalseにしたほうがいいです。
Bitmap rotate90(final Bitmap beforeBmp, final int degrees) {
final int w = beforeBmp.getWidth();
final int h = beforeBmp.getHeight();
final Matrix m = new Matrix();
m.setRotate(degrees);
final Bitmap afterBmp = Bitmap.createBitmap(beforeBmp, 0, 0, w, h, m, false);
return afterBmp;
}
Code language: Java (java)
その他の回転角
引数filterをtrueで回転した画像と、falseで回転した画像は違います。
また、filterをtrueにすると、処理時間が1.5〜3倍長くなります。画像が小さくて、回転後の輪郭や境界のギザギザがあまり目立たないなら、filterをfalseにしたほうがいいかもしれません。
Bitmap rotate(final Bitmap beforeBmp, final float degrees) {
final int w = beforeBmp.getWidth();
final int h = beforeBmp.getHeight();
final Matrix m = new Matrix();
m.setRotate(degrees);
final Bitmap afterBmp = Bitmap.createBitmap(beforeBmp, 0, 0, w, h, m, true);
return afterBmp;
}
Code language: Java (java)
filter=trueとfalseの違い
10x10、左半分を赤、右半分を白にした画像を用意しました。表示のために、100x100に拡大してあります。
回転角=30度、filter=trueで回転した画像です。回転後は14x14ですが、144x144に拡大してあります。(android studioのdebugのview bitmapのスクショです)
回転角=30度、filter=falseで回転した画像です。
filter=trueと比べると、中央の赤と白の境界がギザギザになっています。
元画像がARGB_8888か、RGB_565かで、処理時間が違う
5120x3840の画像を用意しました。
- 回転角=90、30
- filter=true、false
- Bitmap.Config=ARGB_8888、RGB_565
- AVD=29、28、27、26
について、処理時間を測定しました。
ARGB_8888が遅いときは、せいぜい1.6倍遅い程度に対して、RGB_565が遅いときは、2〜3倍遅いことが多かったです。
メモリ使用量のことは考えず、処理時間だけを考えるなら、
90度、filter=false
30度、filter=true
30度、filter=false
どの場合も、ARGB_8888にしたほうがよいようです。
90度、filter=false
RGB_565のほうが速いと予想しましたが、ARGB_8888のほうが優勢でした。
- AVD=29、28は、RGB_565のほうが、1.4〜1.6倍速い。
- AVD=27、26の、ARGB_8888のほうが、2.3〜3倍速い。
機種 | ARGB_8888 (ms) | RGB_565 (ms) | 遅いほう | 何倍遅いか |
SH-M12 | 2155 | 2653 | RGB_565 | 1.2 |
AVD=29 | 693 | 438 | ARGB_8888 | 1.6 |
AVD=28 | 833 | 592 | ARGB_8888 | 1.4 |
AVD=27 | 382 | 1143 | RGB_565 | 3.0 |
AVD=26 | 502 | 1167 | RGB_565 | 2.3 |
30度、filter=true
アンチエイリアスは、ピクセルのR、G、Bごとに計算します。ARGB_8888のRGBアクセスはバイトアクセスです。RGB_565のRGBアクセスはビット分解合成が必要です。ARGB_8888よりRGB_565が遅いのは、バイトアクセスよりビット分解合成のほうが遅いからと推測します。
- 全体的に、ARGB_8888のほうが、1.6〜3.6倍速いです。
- AVD=26は、ほぼ同じ。
機種 | ARGB_8888 (ms) | RGB_565 (ms) | 遅いほう | 何倍遅いか |
SH-M12 | 1283 | 2808 | RGB_565 | 2.2 |
AVD=29 | 369 | 835 | RGB_565 | 2.3 |
AVD=28 | 424 | 671 | RGB_565 | 1.6 |
AVD=27 | 393 | 1398 | RGB_565 | 3.6 |
AVD=26 | 318 | 293 | ARGB_8888 | 1.1 |
30度、filter=false
RGB_565のほうが速いと予想しましたが、ARGB_8888のほうが優勢でした。
- AVD=29、28は、ほぼ同じ。
- AVD=26、27は、ARGB_8888のほうが、約2倍速い。
機種 | ARGB_8888 (ms) | RGB_565 (ms) | 遅いほう | 何倍遅いか |
SH-M12 | 692 | 616 | ARGB_8888 | 1.1 |
AVD=29 | 223 | 227 | RGB_565 | 1.0 |
AVD=28 | 266 | 231 | ARGB_8888 | 1.2 |
AVD=27 | 245 | 467 | RGB_565 | 1.9 |
AVD=26 | 131 | 237 | RGB_565 | 1.8 |
測定データ
SH-M12
回転角度 | filter | ARGB_8888 (ms) | RGB_565 (ms) |
90 | true | 4501 | 4095 |
90 | false | 2155 | 2653 |
30 | true | 1283 | 2808 |
30 | false | 692 | 616 |
AVD=29
回転角度 | filter | ARGB_8888 (ms) | RGB_565 (ms) |
90 | true | 931 | 1248 |
90 | false | 693 | 438 |
30 | true | 369 | 835 |
30 | false | 223 | 227 |
AVD=28
回転角度 | filter | ARGB_8888 (ms) | RGB_565 (ms) |
90 | true | 1212 | 1003 |
90 | false | 833 | 592 |
30 | true | 424 | 671 |
30 | false | 266 | 231 |
AVD=27
回転角度 | filter | ARGB_8888 (ms) | RGB_565 (ms) |
90 | true | 523 | 1462 |
90 | false | 382 | 1143 |
30 | true | 393 | 1398 |
30 | false | 245 | 467 |
AVD=26
回転角度 | filter | ARGB_8888 (ms) | RGB_565 (ms) |
90 | true | 561 | 2911 |
90 | false | 502 | 1167 |
30 | true | 318 | 293 |
30 | false | 131 | 237 |