0

我正在尝试通过闲置代码旋转 Img(Bitmap)。它可以正常工作 5-6 次旋转,之后得到 OME?

private void rotateImg() {
    Matrix matrix = new Matrix();
    matrix.postScale(curScale, curScale);
    matrix.postRotate(curRotate);
    try {
        temp = Bitmap.createBitmap(temp, 0, 0, temp.getWidth(),
                temp.getHeight(), matrix, true);
        setImage.setImageBitmap(temp);
    } catch (OutOfMemoryError e) {
        curRotate = curRotate - 45.0f;
        Toast.makeText( this,"Out Of Memory",Toast.LENGTH_LONG).show();
    }
}

这里的“test”是从 SDCard 加载的静态位图文件。

4

3 回答 3

1

为什么每次都创建位图?有什么具体原因吗?如果不使用以下代码:

private void rotateImg() {
    int cx = temp.getWidth() / 2;
    int cy = temp.getHeight() / 2;
    matrix.preTranslate(-cx, -cy);
    matrix.postRotate(curRotate);
    matrix.postTranslate(cx, cy);
    setImage.setImageMatrix(matrix);
}
于 2012-05-28T05:06:48.050 回答
1

第一个答案可能是一个潜在的解决方案。这里的问题是您正在创建很多相当大的 Bitmap 对象,并且无论出于何种原因,它们都没有被 gc 处理。

更好的解决方案可能是使用单个位图,并在绘制时应用旋转/缩放。例如,如果您在 aCanvas的一部分上绘图View,则 rotateImg 可以简单地旋转矩阵并调用invalidate视图,然后在视图的onDraw方法中使用void drawBitmap (Bitmap bitmap, Matrix matrix, Paint paint)画布上的 来渲染位图。文档在这里

于 2012-05-18T11:37:03.020 回答
0

也许你bitmap.recycle()每次调用这个方法时都必须使用方法。试试这样的,

private void rotateImg() {
    Matrix matrix = new Matrix();
    matrix.postScale(curScale, curScale);
    matrix.postRotate(curRotate);
    try {
         temp.recycle();  //removes the memory occupied by this bitmap object
          temp=null;
        temp = Bitmap.createBitmap(temp, 0, 0, temp.getWidth(),
                temp.getHeight(), matrix, true);
        setImage.setImageBitmap(temp);
    } catch (OutOfMemoryError e) {
        curRotate = curRotate - 45.0f;
        Toast.makeText( this,"Out Of Memory",Toast.LENGTH_LONG).show();
    }
}
于 2012-05-18T11:24:24.970 回答