[英]Crash in Android App
我有这个代码
public void DetectFacesInImage(View view)
{
BitmapFactory.Options bitmapFactoryOptions=new BitmapFactory.Options();
bitmapFactoryOptions.inPreferredConfig= Bitmap.Config.RGB_565;
//int resID = getResources().getIdentifier(picturePath , "drawable", getPackageName());
myBitmap=BitmapFactory.decodeFile(picturePath,bitmapFactoryOptions);
int width=myBitmap.getWidth();
int height=myBitmap.getHeight();
detectedFaces=new FaceDetector.Face[number_of_faces];
FaceDetector faceDetector=new FaceDetector(width,height,number_of_faces);
number_of_faces_detected = faceDetector.findFaces(myBitmap, detectedFaces);
Canvas canvas = new Canvas(myBitmap);// line 70 the point where it crashes
Paint paint = new Paint(Paint.FILTER_BITMAP_FLAG);
//canvas.drawBitmap(overlay, 0, 0, paint);
paint.setColor(Color.GREEN);
paint.setStyle(Paint.Style.STROKE);
paint.setStrokeWidth(3);
PointF midPoint=new PointF();
for(int count=0;count<number_of_faces_detected;count++)
{
Face face=detectedFaces[count];
face.getMidPoint(midPoint);
float eyeDistance=face.eyesDistance();
canvas.drawRect(midPoint.x-eyeDistance, midPoint.y-eyeDistance, midPoint.x+eyeDistance, midPoint.y+eyeDistance, paint);
}
}
我想在位图的顶部绘制矩形。 通过意图接收位图是这样使用的
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_detect_faces);
// getActionBar().setDisplayHomeAsUpEnabled(true);
Intent intent = getIntent();
ImageView imageView = (ImageView) findViewById(R.id.imgView);
picturePath = intent.getStringExtra(GetFaceActivity.PICTURE_PATH);
imageView.setImageBitmap(BitmapFactory.decodeFile(picturePath));
//imageView.setOnTouchListener(this);
}
但是代码崩溃,错误传递给Canvas构造函数的不可变位图。 我在这里做错了什么?
这是堆栈跟踪
10-14 20:01:34.763: E/AndroidRuntime(31137): FATAL EXCEPTION: main
10-14 20:01:34.763: E/AndroidRuntime(31137): java.lang.IllegalStateException: Could not execute method of the activity
10-14 20:01:34.763: E/AndroidRuntime(31137): at android.view.View$1.onClick(View.java:3098)
10-14 20:01:34.763: E/AndroidRuntime(31137): at android.view.View.performClick(View.java:3620)
10-14 20:01:34.763: E/AndroidRuntime(31137): at android.view.View$PerformClick.run(View.java:14322)
10-14 20:01:34.763: E/AndroidRuntime(31137): at android.os.Handler.handleCallback(Handler.java:605)
10-14 20:01:34.763: E/AndroidRuntime(31137): at android.os.Handler.dispatchMessage(Handler.java:92)
10-14 20:01:34.763: E/AndroidRuntime(31137): at android.os.Looper.loop(Looper.java:137)
10-14 20:01:34.763: E/AndroidRuntime(31137): at android.app.ActivityThread.main(ActivityThread.java:4507)
10-14 20:01:34.763: E/AndroidRuntime(31137): at java.lang.reflect.Method.invokeNative(Native Method)
10-14 20:01:34.763: E/AndroidRuntime(31137): at java.lang.reflect.Method.invoke(Method.java:511)
10-14 20:01:34.763: E/AndroidRuntime(31137): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:978)
10-14 20:01:34.763: E/AndroidRuntime(31137): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:745)
10-14 20:01:34.763: E/AndroidRuntime(31137): at dalvik.system.NativeStart.main(Native Method)
10-14 20:01:34.763: E/AndroidRuntime(31137): Caused by: java.lang.reflect.InvocationTargetException
10-14 20:01:34.763: E/AndroidRuntime(31137): at java.lang.reflect.Method.invokeNative(Native Method)
10-14 20:01:34.763: E/AndroidRuntime(31137): at java.lang.reflect.Method.invoke(Method.java:511)
10-14 20:01:34.763: E/AndroidRuntime(31137): at android.view.View$1.onClick(View.java:3093)
10-14 20:01:34.763: E/AndroidRuntime(31137): ... 11 more
10-14 20:01:34.763: E/AndroidRuntime(31137): Caused by: java.lang.IllegalStateException: Immutable bitmap passed to Canvas constructor
10-14 20:01:34.763: E/AndroidRuntime(31137): at android.graphics.Canvas.<init>(Canvas.java:133)
10-14 20:01:34.763: E/AndroidRuntime(31137): at com.example.face_tag_upload.DetectFaces.DetectFacesInImage(DetectFaces.java:70)
10-14 20:01:34.763: E/AndroidRuntime(31137): ... 14 more
如果您正在使用API等级11及以上,然后工作,你需要指定inMutable
作为您的一部分BitMapFactory.Options
,所以,
BitmapFactory.Option bitmapFactoryOptions = new BitmapFactory.Options();
bitmapFactoryOptions.inPreferredConfig = Bitmap.Config.RGB_565;
bitmapFactoryOption.inMutable = true;
如果您想早于API级别11,则需要使用以下代码段创建可变的位图;
Bitmap immutableBitmap = BitmapFactory.decodeFile(picturePath, bitmapFactoryOptions);
int left = 0;
int top = 0;
int width = immutableBitmap.getWidth();
int height = immutableBitmap.getHeight();
boolean hasAlpha = immutableBitmap.hasAlpha();
Bitmap mutableBitmap = immutableBitmap.createBitmap(width, height, hasAlpha);
Canvas c = new Canvas();
c.setDevice(mutableBitmap);
c.drawBitmap(immutableBitmap, left, top, paint);
paint变量来自您先前存在的代码。
此答案将原始位图写入磁盘,然后创建该位图的可变版本,从而避免在内存中需要两个位图。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.