在 android 中是否有任何其他替代方法可用于获取 ImageView 并将其转换为 Bitmap 以进行图像分类?
Is there any other alternative available to get ImageView and convert it into Bitmap for image classification in android?
我想从 ImageView
获取位图。我使用了以下代码,但它抛出 ArrayIndexOutOfBoundExcpetion
。如何解决这个问题?
bitmap.getPixels(mImagePixels, 0, bitmap.getWidth(), 0, 0,
bitmap.getWidth(), bitmap.getHeight());
int pixel = 0;
for (int i = 0; i < DIM_IMG_SIZE_WIDTH; ++i) {
for (int j = 0; j < DIM_IMG_SIZE_HEIGHT; ++j) {
final int val = mImagePixels[pixel++];
mImgData.putFloat(convertToGreyScale(val));
}
}
}
private float convertToGreyScale(int color) {
return (((color >> 16) & 0xFF) + ((color >> 8) & 0xFF) + (color & 0xFF)) / 3.0f / 255.0f;
}
java.lang.ArrayIndexOutOfBoundsException
at android.graphics.Bitmap.checkPixelsAccess(Bitmap.java:1824)
at android.graphics.Bitmap.getPixels(Bitmap.java:1765)
at com.drprajapati.android.plantclassification.ml.Classifier.convertBitmapToByteBuffer(Classifier.java:69)
at com.drprajapati.android.plantclassification.ml.Classifier.classify(Classifier.java:53)
at com.drprajapati.android.plantclassification.MainActivity.onClick(MainActivity.java:58)
at android.view.View.performClick(View.java:6671)
at android.view.View.performClickInternal(View.java:6640)
at android.view.View.access00(View.java:791)
at android.view.View$PerformClick.run(View.java:26173)
at android.os.Handler.handleCallback(Handler.java:873)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:6912)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:537)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
您可以从 ImageView 中以 drawable 形式获取图像,然后通过将 drawable 传递给以下方法将 drawable 转换为位图。
public static Bitmap drawableToBitmap (Drawable drawable) {
Bitmap bitmap = null;
if (drawable instanceof BitmapDrawable) {
BitmapDrawable bitmapDrawable = (BitmapDrawable) drawable;
if(bitmapDrawable.getBitmap() != null) {
return bitmapDrawable.getBitmap();
}
}
if(drawable.getIntrinsicWidth() <= 0 || drawable.getIntrinsicHeight() <= 0) {
bitmap = Bitmap.createBitmap(1, 1, Bitmap.Config.ARGB_8888); // Single color
bitmap will be created of 1x1 pixel
} else {
bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(),
drawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888);
}
Canvas canvas = new Canvas(bitmap);
drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
drawable.draw(canvas);
return bitmap;
}
考虑试试这个
BitmapDrawable drawable = (BitmapDrawable) imageView.getDrawable();
Bitmap bitmap = drawable.getBitmap();
我想从 ImageView
获取位图。我使用了以下代码,但它抛出 ArrayIndexOutOfBoundExcpetion
。如何解决这个问题?
bitmap.getPixels(mImagePixels, 0, bitmap.getWidth(), 0, 0,
bitmap.getWidth(), bitmap.getHeight());
int pixel = 0;
for (int i = 0; i < DIM_IMG_SIZE_WIDTH; ++i) {
for (int j = 0; j < DIM_IMG_SIZE_HEIGHT; ++j) {
final int val = mImagePixels[pixel++];
mImgData.putFloat(convertToGreyScale(val));
}
}
}
private float convertToGreyScale(int color) {
return (((color >> 16) & 0xFF) + ((color >> 8) & 0xFF) + (color & 0xFF)) / 3.0f / 255.0f;
}
java.lang.ArrayIndexOutOfBoundsException
at android.graphics.Bitmap.checkPixelsAccess(Bitmap.java:1824)
at android.graphics.Bitmap.getPixels(Bitmap.java:1765)
at com.drprajapati.android.plantclassification.ml.Classifier.convertBitmapToByteBuffer(Classifier.java:69)
at com.drprajapati.android.plantclassification.ml.Classifier.classify(Classifier.java:53)
at com.drprajapati.android.plantclassification.MainActivity.onClick(MainActivity.java:58)
at android.view.View.performClick(View.java:6671)
at android.view.View.performClickInternal(View.java:6640)
at android.view.View.access00(View.java:791)
at android.view.View$PerformClick.run(View.java:26173)
at android.os.Handler.handleCallback(Handler.java:873)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:6912)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:537)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
您可以从 ImageView 中以 drawable 形式获取图像,然后通过将 drawable 传递给以下方法将 drawable 转换为位图。
public static Bitmap drawableToBitmap (Drawable drawable) {
Bitmap bitmap = null;
if (drawable instanceof BitmapDrawable) {
BitmapDrawable bitmapDrawable = (BitmapDrawable) drawable;
if(bitmapDrawable.getBitmap() != null) {
return bitmapDrawable.getBitmap();
}
}
if(drawable.getIntrinsicWidth() <= 0 || drawable.getIntrinsicHeight() <= 0) {
bitmap = Bitmap.createBitmap(1, 1, Bitmap.Config.ARGB_8888); // Single color
bitmap will be created of 1x1 pixel
} else {
bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(),
drawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888);
}
Canvas canvas = new Canvas(bitmap);
drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
drawable.draw(canvas);
return bitmap;
}
考虑试试这个
BitmapDrawable drawable = (BitmapDrawable) imageView.getDrawable();
Bitmap bitmap = drawable.getBitmap();