使用矩阵旋转位图

时间:2010-08-09 13:56:33

标签: android matrix bitmap rotation

使用矩阵旋转位图时,顶点不稳定..

  Matrix matrix = new Matrix();
    matrix.postRotate(mDegree,100,100);
    mCompasstemp = Bitmap.createBitmap(mCompPic, 0, 0, mCompPic.getWidth(), mCompPic.getHeight(), matrix, true);
    mCompassHud.setImageBitmap(mCompasstemp);

我的代码输出就像 -bitmap将旋转。 我的位图的-vertex不稳定。 -Bitmap正在调整大小

我需要禁用图像大小调整并使旋转稳定。您能为此建议一个解决方案吗?

4 个答案:

答案 0 :(得分:5)

不是直接从原始位图创建新的Bitmap,而是另一个(更直接的,imho)选项是创建结果Bitmap,使用该Bitmap创建Canvas,然后在Canvas上进行旋转/平移/缩放。通过画布将原始位图绘制到新的位图上。

基本上,你正在寻找:

  scaledImage = Bitmap.createBitmap (croppedWidth, croppedHeight, Bitmap.Config.ARGB_8888);

  Canvas offscreenCanvas = new Canvas (scaledImage);
  Matrix matrix = new Matrix();
  matrix.setRotate (rotations, centreX, centreY);
  matrix.postScale(scaleX, scaleY);
  offscreenCanvas.setMatrix (matrix);

  offscreenCanvas.drawBitmap (pickedImage, 0, 0, new Paint(Paint.DITHER_FLAG));

答案 1 :(得分:1)

不确定这是否是你想要的,但它可能会有所帮助。

Android使用其内置的兼容性功能来针对具有不同像素密度的屏幕进行适当缩放和渲染位图。缩放,预缩放和自动缩放有两种方法。

它将从资源中预先缩放位图'并在内部绘制位图时自动缩放(这就是你在使用createBitmap所做的事情)。

转到http://developer.android.com/guide/practices/screens_support.html并在以下位置检查:    4.使用密度和/或特定大小的资源:       位图和九个补丁的预缩放和自动缩放

答案 2 :(得分:1)

我试过这段代码,旋转在位图的中心是稳定的

matrix.reset();
matrix.setRotate(degree, Xpos+bitmap.getWidth()/2, Ypos+bitmap.getHeight()/2);

然后在canvas doDraw()

canvas.setMatrix(matrix);               
canvas.drawBitmap(bitmap, Xpos, Ypos, null);
canvas.setMatrix(null);

Xpos和Ypos是位图的X和Y位置 setMatrix(null),将矩阵设置为null,以便旋转不影响after位图 它并不总是创建新的位图,因此它对性能很有帮助 我希望有帮助

答案 3 :(得分:0)

我知道这是一个古老的问题但是,代码的所有答案都暗示了画布,所以这是一个没有画布的解决方案,对我有用:

Matrix matrix = new Matrix();
matrix.postRotate(mDegree,100,100);
mCompasstemp = Bitmap.createBitmap(mCompPic, 0, 0, mCompPic.getWidth(),
    mCompPic.getHeight(), matrix, true);

mCompasstemp = Bitmap.createScaledBitmap(mCompassTemp, mCompPic.getWidth(),
    mCompic.getHeight(), false);

mCompassHud.setImageBitmap(mCompasstemp);

所以基本上在旋转位图后,您将其重新缩放到所需的大小。可能不是最好的练习,但至少你不需要创建一个额外的画布,如果你不想要/需要,因为涉及Paint()对象也不是一个廉价的操作。