我正在尝试使用Android工作室创建一个应用程序,允许用户从他们的图库中选择一张照片,然后确定图片中最亮的区域。它通过分析图像的较小部分并总结该区域中的所有像素来实现这一点。附上我的代码和我在下面的错误。任何帮助将非常感激!
public void onImageGalleryClicked(View v) {
Intent photoPickerIntent = new Intent(Intent.ACTION_PICK);
File pictureDirectory = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);
String pictureDirectoryPath = pictureDirectory.getPath();
Uri data = Uri.parse(pictureDirectoryPath);
photoPickerIntent.setDataAndType(data, "image/*");
startActivityForResult(photoPickerIntent, IMAGE_GALLERY_REQUEST);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode == RESULT_OK) {
//if we are here, everything has been processed successfully
if (requestCode == IMAGE_GALLERY_REQUEST) {
Uri imageUri = data.getData();
InputStream inputStream;
try {
inputStream = getContentResolver().openInputStream(imageUri);
Bitmap image = BitmapFactory.decodeStream(inputStream);
int w = image.getWidth();
int h = image.getHeight();
pixels = new int[4*w*h];
int a = 20; //this is the width of the smaller image that we are cropping to sum up
int b = 20; ////this is the length(height) of the smaller image that we are cropping to sum up
int tempmax = 0;
int sum = 0;
int k = 0;
for (int i =0; i< h - b; i++) {
for (int j = 0; j < w-a; j++) {
image.getPixels(pixels, k*i+j,0, j, i, a, b);
for (int e = 0; e < a*b; e++) {
sum = sum + pixels[e+k*i+j];
}
if (sum > tempmax) {
tempmax = sum;
}
sum = 0;
}
k = k + 1;
}
} catch (FileNotFoundException e) {
e.printStackTrace();
Toast.makeText(this, "Unable to open image", Toast.LENGTH_LONG).show();
}
}
}
}
}
这是我得到的错误:
02 - 18 21: 57: 08.794 7681 - 7681 / com.example.garrett.debuggingcode E / AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.garrett.debuggingcode, PID: 7681
java.lang.RuntimeException: Failure delivering result ResultInfo {
who = null, request = 20, result = -1, data = Intent {
dat = content: //media/external/images/media/217 flg=0x1 launchParam=MultiScreenLaunchParams { mDisplayId=0 mBaseDisplayId=0 mFlags=0 } (has extras) }} to activity {com.example.garrett.debuggingcode/com.example.garrett.debuggingcode.MainActivity}: java.lang.IllegalArgumentException: abs(stride) must be >= width
at android.app.ActivityThread.deliverResults(ActivityThread.java: 4556)
at android.app.ActivityThread.handleSendResult(ActivityThread.java: 4599)
at android.app.ActivityThread. - wrap22(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java: 1715)
at android.os.Handler.dispatchMessage(Handler.java: 102)
at android.os.Looper.loop(Looper.java: 154)
at android.app.ActivityThread.main(ActivityThread.java: 6823)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java: 1557)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java: 1445)
Caused by: java.lang.IllegalArgumentException: abs(stride) must be >= width
at android.graphics.Bitmap.checkPixelsAccess(Bitmap.java: 1896)
at android.graphics.Bitmap.getPixels(Bitmap.java: 1844)
at com.example.garrett.debuggingcode.MainActivity.onActivityResult(MainActivity.java: 73)
at android.app.Activity.dispatchActivityResult(Activity.java: 7322)
at android.app.ActivityThread.deliverResults(ActivityThread.java: 4552)
at android.app.ActivityThread.handleSendResult(ActivityThread.java: 4599)
at android.app.ActivityThread. - wrap22(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java: 1715)
at android.os.Handler.dispatchMessage(Handler.java: 102)
at android.os.Looper.loop(Looper.java: 154)
at android.app.ActivityThread.main(ActivityThread.java: 6823)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java: 1557)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java: 1445)