修改位图时Android崩溃:jni_helper.cc:110位图的格式错误:4

时间:2016-11-21 07:29:21

标签: android bitmap android-canvas android-bitmap ontouch

我正在开发应用程序,允许用户在滑动时覆盖部分位图。然后,当他完成滑动时,我调用一种方法来裁剪位图的这一部分并执行一些功能(但是裁剪的位图不会保存在任何地方,所以怀疑这里有任何问题)。点击imageView我用原始位图重置位图。还有一个旋转位图的功能。我有两个位图对象bill(用户实际滑动它)和billOrg(原始位图原样)。以下是方法。

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();
}

这是旋转位图的方法:

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);
        }
    }

点击时重置位图的方法:

class LicenseChecker
{
    private Timer mTimer;
    public delegate void LicenseNotValidDelegate();
    public event LicenseNotValidDelegate LicenseNotValid;

    public LicenseChecker()
    {
        mTimer = new Timer();
        mTimer.Ticket += mTimer_Tick;
        mTimer.Interval = TimeSpan.FromSeconds(10);
    }

    public void Start()
    {
        mTimer.Start();
    }

    void mTimer_Tick(object sender, EventArgs e)
    {
        if(!CheckLicense())
            LicenseNotValid?.Invoke();
    }

    private bool CheckLicense()
    { ... }
}

...
public void Main()
{
    var lLC = new LicenseChecker();
    lLC.LicenseNotValid += lLC_LicenseNotValid;
    lLC.Start();
}

void lLC_LicenseNotValid()
{
    //code when license is not valid
}

一切都很好,除非用户首先滑动图像 - >然后旋转图像 - >然后点击位图。 我得到的只是这个错误:jni_helper.cc:110位图的格式错误:4 。没有其他例外。 根据我的知识,如果我们尝试修改一个不可变的位图对象,那么位图通常会抛出错误,但我在所有地方都使它变得可变。它也会在日志中打印出来。我想在修改位图时我做错了什么。我知道可能会让你感到困惑。我不知道我的解释有多好。如果您需要任何清晰度,请询问。我需要一些帮助。

1 个答案:

答案 0 :(得分:0)

好的,所以我发现了导致问题的原因。

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

在drawShade()方法中是罪魁祸首。我将“Bitmap.Config.RGB_565”更改为bill.getConfig()并修复了它。