我正在开发应用程序,允许用户在滑动时覆盖部分位图。然后,当他完成滑动时,我调用一种方法来裁剪位图的这一部分并执行一些功能(但是裁剪的位图不会保存在任何地方,所以怀疑这里有任何问题)。点击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 。没有其他例外。 根据我的知识,如果我们尝试修改一个不可变的位图对象,那么位图通常会抛出错误,但我在所有地方都使它变得可变。它也会在日志中打印出来。我想在修改位图时我做错了什么。我知道可能会让你感到困惑。我不知道我的解释有多好。如果您需要任何清晰度,请询问。我需要一些帮助。
答案 0 :(得分:0)
好的,所以我发现了导致问题的原因。
Bitmap tempBitmap = Bitmap.createBitmap(bill.getWidth(), bill.getHeight(), Bitmap.Config.RGB_565);
在drawShade()方法中是罪魁祸首。我将“Bitmap.Config.RGB_565”更改为bill.getConfig()并修复了它。