【问题标题】:Rotating a bitmap using matrix使用矩阵旋转位图
【发布时间】:2010-08-09 13:56:33
【问题描述】:
使用矩阵旋转位图时,顶点不稳定..
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 正在调整大小
我需要禁用图像调整大小并使旋转稳定。您能提出解决方案吗?
【问题讨论】:
标签:
android
matrix
bitmap
rotation
【解决方案1】:
不是直接从原始位图创建新位图,另一个(更直接,恕我直言)选项是创建结果位图,使用该位图创建画布,然后在画布上进行旋转/平移/缩放,然后通过 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));
【解决方案3】:
我试过这段代码,旋转在位图的中心是稳定的
matrix.reset();
matrix.setRotate(degree, Xpos+bitmap.getWidth()/2, Ypos+bitmap.getHeight()/2);
然后在画布中 doDraw()
canvas.setMatrix(matrix);
canvas.drawBitmap(bitmap, Xpos, Ypos, null);
canvas.setMatrix(null);
Xpos 和 Ypos 是位图的 X 和 Y 位置
setMatrix(null),设置矩阵为null,这样旋转不影响后位图
而且它并不总是创建新的位图,因此对性能非常有用
希望对你有帮助
【解决方案4】:
我知道这是一个老问题,但是,所有的代码答案都暗示了一个画布,所以这里有一个对我有用的没有画布的解决方案:
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() 对象也不是一个廉价的操作。