2016-11-21 1 views
0

Ich arbeite an einer Anwendung, mit der Benutzer einen Teil der Bitmap schattieren können, wenn sie darauf wischen. Dann, wenn er mit dem Wischen fertig ist, rufe ich eine Methode auf, um diesen Teil der Bitmap zuzuschneiden und eine Funktion auszuführen (aber abgeschnittene Bitmap wird nirgendwo gespeichert, also bezweifle ich, dass es hier irgendein Problem gibt). Beim Klicken auf imageView setze ich die Bitmap mit Original Bitmap zurück. Es gibt auch eine Funktion zum Drehen der Bitmap.Ich habe zwei Bitmap-Objekte Rechnung (Benutzer wischt tatsächlich darüber) und billOrg (original Bitmap wie es ist). Unten sind die Methoden.Android stürzt beim Ändern der Bitmap ab: jni_helper.cc:110 Bitmap hat das falsche Format: 4

private void drawShade(float left,float top,float right,float bottom){ 
    //this method draws shade on bitmap. Coordinates are sent from onTouchEvent 
    TAG = "drawShade"; 
    //parseTouchPointsString(); 
    Bitmap tempBitmap = Bitmap.createBitmap(bill.getWidth(), bill.getHeight(), Bitmap.Config.RGB_565); 
    Log.d(TAG,"bill:"+bill.isMutable()+"tempBit:"+tempBitmap.isMutable()+""); 
    Canvas tempCanvas = new Canvas(tempBitmap); 
    tempCanvas.drawBitmap(bill,0,0,null); 
    tempCanvas.drawRoundRect(new RectF(left,top,right,bottom), 10, 10, shadePaint); 
    imgView.setImageDrawable(new BitmapDrawable(getResources(), tempBitmap)); 
    if(fingerUp) { 
     Log.e("fingerUp",fingerUp+""); 
     bill = tempBitmap; 
    } 
    Log.d(TAG,"shade drawn at:"+left+","+top+","+right+","+bottom); 
} 

Hier Methode Bitmap drehen:

public void rotateImage(View v){ 
    TAG = "rotateImage"; 
    Matrix matrix = new Matrix(); 
    matrix.postRotate(90); 
    Bitmap rotatedBitmap = Bitmap.createBitmap(bill , 0, 0, bill.getWidth(), bill.getHeight(), matrix, true); 
    bill = rotatedBitmap.copy(rotatedBitmap.getConfig(),true); 
    createScaledBitmap(); 
    billOrg = bill.copy(rotatedBitmap.getConfig(),true);//bill.copy(bill.getConfig(),false); 
    setImage(bill); 

    rl.invalidate(); 
} 

Methode Bitmap auf Klick zurück:

private void resetImageView(boolean saveShade){ 
     //the boolean var here tell whether to keep the shaded portion after reset or not 
     if(!saveShade) { //app crashes in this if block although I have try-catch. 
      try { 
       Canvas canvas = new Canvas(bill); 
       Log.e("resetImageView", "billOrg:" + billOrg.isMutable() + ",bill:" + bill.isMutable()); //returns true for both bitmap objects 
       canvas.drawBitmap(billOrg, 0, 0, null); 
       touchBounds = ""; 
       tv_res.setText(""); 
       rl.invalidate(); 
       setImage(bill); 
      }catch(Exception ex){ 
       Log.e("resetImage",ex.getMessage()); 
      } 
     }else{ 
      Canvas canvas = new Canvas(bill); 
      canvas.drawBitmap(bill, 0, 0, null); 
      touchBounds = ""; 
      tv_res.setText(""); 
      rl.invalidate(); 
      setImage(bill); 
     } 
    } 

Alles ist in Ordnung, außer, wenn der Benutzer zuerst das Bild klaut -> dann dreht das Bild -> klickt dann auf Bitmap. Alles was ich bekomme ist dieser Fehler: jni_helper.cc:110 Bitmap hat das falsche Format: 4. Keine weiteren Ausnahmen. Bitmaps werfen normalerweise Fehler aus, wenn wir versuchen, ein Bitmap-Objekt zu ändern, das unveränderlich ist, aber ich habe es überall änderbar gemacht. Es druckt auch veränderbar in den Protokollen. Ich denke, ich mache etwas falsch, während ich die Bitmaps modifiziere. Ich weiß, das könnte für dich verwirrend sein. Ich weiß nicht, wie gut ich das erklärt habe. Wenn Sie Klarheit brauchen, fragen Sie uns. Ich brauche Hilfe.

Antwort

0

Ok, also habe ich herausgefunden, was das Problem verursacht hat.

Bitmap tempBitmap = Bitmap.createBitmap(bill.getWidth(), bill.getHeight(), Bitmap.Config.RGB_565); 

In der DrawShade() -Methode war Täter. Ich habe die "Bitmap.Config.RGB_565" in bill.getConfig() geändert und es wurde behoben.