You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

mat_pixel_android.cpp 5.8 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213
  1. // Copyright 2019 Tencent
  2. // SPDX-License-Identifier: BSD-3-Clause
  3. #include "mat.h"
  4. #if NCNN_PIXEL
  5. #if NCNN_PLATFORM_API
  6. #if __ANDROID_API__ >= 9
  7. #include <android/bitmap.h>
  8. #include <jni.h>
  9. #endif // __ANDROID_API__ >= 9
  10. #endif // NCNN_PLATFORM_API
  11. namespace ncnn {
  12. #if NCNN_PLATFORM_API
  13. #if __ANDROID_API__ >= 9
  14. Mat Mat::from_android_bitmap(JNIEnv* env, jobject bitmap, int type_to, Allocator* allocator)
  15. {
  16. AndroidBitmapInfo info;
  17. AndroidBitmap_getInfo(env, bitmap, &info);
  18. int type_from;
  19. int elempack;
  20. if (info.format == ANDROID_BITMAP_FORMAT_A_8)
  21. {
  22. type_from = PIXEL_GRAY;
  23. elempack = 1;
  24. }
  25. else if (info.format == ANDROID_BITMAP_FORMAT_RGBA_8888)
  26. {
  27. type_from = PIXEL_RGBA;
  28. elempack = 4;
  29. }
  30. else
  31. {
  32. // unsuppored android bitmap format
  33. return Mat();
  34. }
  35. // let PIXEL_RGBA2XXX become PIXEL_XXX
  36. type_to = (type_to & PIXEL_CONVERT_MASK) ? (type_to >> PIXEL_CONVERT_SHIFT) : (type_to & PIXEL_FORMAT_MASK);
  37. void* data;
  38. AndroidBitmap_lockPixels(env, bitmap, &data);
  39. int type = type_to == type_from ? type_from : (type_from | (type_to << PIXEL_CONVERT_SHIFT));
  40. Mat m = Mat::from_pixels((const unsigned char*)data, type, info.width, info.height, info.stride, allocator);
  41. AndroidBitmap_unlockPixels(env, bitmap);
  42. return m;
  43. }
  44. Mat Mat::from_android_bitmap_resize(JNIEnv* env, jobject bitmap, int type_to, int target_width, int target_height, Allocator* allocator)
  45. {
  46. AndroidBitmapInfo info;
  47. AndroidBitmap_getInfo(env, bitmap, &info);
  48. int type_from;
  49. int elempack;
  50. if (info.format == ANDROID_BITMAP_FORMAT_A_8)
  51. {
  52. type_from = PIXEL_GRAY;
  53. elempack = 1;
  54. }
  55. else if (info.format == ANDROID_BITMAP_FORMAT_RGBA_8888)
  56. {
  57. type_from = PIXEL_RGBA;
  58. elempack = 4;
  59. }
  60. else
  61. {
  62. // unsuppored android bitmap format
  63. return Mat();
  64. }
  65. // let PIXEL_RGBA2XXX become PIXEL_XXX
  66. type_to = (type_to & PIXEL_CONVERT_MASK) ? (type_to >> PIXEL_CONVERT_SHIFT) : (type_to & PIXEL_FORMAT_MASK);
  67. void* data;
  68. AndroidBitmap_lockPixels(env, bitmap, &data);
  69. int type = type_to == type_from ? type_from : (type_from | (type_to << PIXEL_CONVERT_SHIFT));
  70. Mat m = Mat::from_pixels_resize((const unsigned char*)data, type, info.width, info.height, info.stride, target_width, target_height, allocator);
  71. AndroidBitmap_unlockPixels(env, bitmap);
  72. return m;
  73. }
  74. Mat Mat::from_android_bitmap_roi(JNIEnv* env, jobject bitmap, int type_to, int roix, int roiy, int roiw, int roih, Allocator* allocator)
  75. {
  76. AndroidBitmapInfo info;
  77. AndroidBitmap_getInfo(env, bitmap, &info);
  78. int type_from;
  79. int elempack;
  80. if (info.format == ANDROID_BITMAP_FORMAT_A_8)
  81. {
  82. type_from = PIXEL_GRAY;
  83. elempack = 1;
  84. }
  85. else if (info.format == ANDROID_BITMAP_FORMAT_RGBA_8888)
  86. {
  87. type_from = PIXEL_RGBA;
  88. elempack = 4;
  89. }
  90. else
  91. {
  92. // unsuppored android bitmap format
  93. return Mat();
  94. }
  95. // let PIXEL_RGBA2XXX become PIXEL_XXX
  96. type_to = (type_to & PIXEL_CONVERT_MASK) ? (type_to >> PIXEL_CONVERT_SHIFT) : (type_to & PIXEL_FORMAT_MASK);
  97. void* data;
  98. AndroidBitmap_lockPixels(env, bitmap, &data);
  99. int type = type_to == type_from ? type_from : (type_from | (type_to << PIXEL_CONVERT_SHIFT));
  100. Mat m = Mat::from_pixels_roi((const unsigned char*)data, type, info.width, info.height, info.stride, roix, roiy, roiw, roih, allocator);
  101. AndroidBitmap_unlockPixels(env, bitmap);
  102. return m;
  103. }
  104. Mat Mat::from_android_bitmap_roi_resize(JNIEnv* env, jobject bitmap, int type_to, int roix, int roiy, int roiw, int roih, int target_width, int target_height, Allocator* allocator)
  105. {
  106. AndroidBitmapInfo info;
  107. AndroidBitmap_getInfo(env, bitmap, &info);
  108. int type_from;
  109. int elempack;
  110. if (info.format == ANDROID_BITMAP_FORMAT_A_8)
  111. {
  112. type_from = PIXEL_GRAY;
  113. elempack = 1;
  114. }
  115. else if (info.format == ANDROID_BITMAP_FORMAT_RGBA_8888)
  116. {
  117. type_from = PIXEL_RGBA;
  118. elempack = 4;
  119. }
  120. else
  121. {
  122. // unsuppored android bitmap format
  123. return Mat();
  124. }
  125. // let PIXEL_RGBA2XXX become PIXEL_XXX
  126. type_to = (type_to & PIXEL_CONVERT_MASK) ? (type_to >> PIXEL_CONVERT_SHIFT) : (type_to & PIXEL_FORMAT_MASK);
  127. void* data;
  128. AndroidBitmap_lockPixels(env, bitmap, &data);
  129. int type = type_to == type_from ? type_from : (type_from | (type_to << PIXEL_CONVERT_SHIFT));
  130. Mat m = Mat::from_pixels_roi_resize((const unsigned char*)data, type, info.width, info.height, info.stride, roix, roiy, roiw, roih, target_width, target_height, allocator);
  131. AndroidBitmap_unlockPixels(env, bitmap);
  132. return m;
  133. }
  134. void Mat::to_android_bitmap(JNIEnv* env, jobject bitmap, int type_from) const
  135. {
  136. AndroidBitmapInfo info;
  137. AndroidBitmap_getInfo(env, bitmap, &info);
  138. int type_to;
  139. if (info.format == ANDROID_BITMAP_FORMAT_A_8)
  140. {
  141. type_to = PIXEL_GRAY;
  142. }
  143. else if (info.format == ANDROID_BITMAP_FORMAT_RGBA_8888)
  144. {
  145. type_to = PIXEL_RGBA;
  146. }
  147. else
  148. {
  149. // unsuppored android bitmap format
  150. return;
  151. }
  152. // let PIXEL_XXX2RGBA become PIXEL_XXX
  153. type_from = (type_from & PIXEL_CONVERT_MASK) ? (type_from & PIXEL_FORMAT_MASK) : type_from;
  154. void* _data;
  155. AndroidBitmap_lockPixels(env, bitmap, &_data);
  156. int type = type_from == type_to ? type_to : (type_from | (type_to << PIXEL_CONVERT_SHIFT));
  157. to_pixels_resize((unsigned char*)_data, type, info.width, info.height, info.stride);
  158. AndroidBitmap_unlockPixels(env, bitmap);
  159. }
  160. #endif // __ANDROID_API__ >= 9
  161. #endif // NCNN_PLATFORM_API
  162. } // namespace ncnn
  163. #endif // NCNN_PIXEL