如何旋转90度的位图
在android canvas.drawBitmap(visiblePage, 0, 0, paint);
有一个语句canvas.drawBitmap(visiblePage, 0, 0, paint);
当我添加canvas.rotate(90)
,没有任何效果。 但是,如果我写
canvas.rotate(90) canvas.drawBitmap(visiblePage, 0, 0, paint);
我没有绘制位图。 那么我没做对吗?
你也可以试试这个
Matrix matrix = new Matrix(); matrix.postRotate(90); Bitmap scaledBitmap = Bitmap.createScaledBitmap(bitmapOrg,width,height,true); Bitmap rotatedBitmap = Bitmap.createBitmap(scaledBitmap , 0, 0, scaledBitmap .getWidth(), scaledBitmap .getHeight(), matrix, true);
然后你可以使用旋转的图像来设置你的imageview通过
imageView.setImageBitmap(rotatedBitmap);
public static Bitmap RotateBitmap(Bitmap source, float angle) { Matrix matrix = new Matrix(); matrix.postRotate(angle); return Bitmap.createBitmap(source, 0, 0, source.getWidth(), source.getHeight(), matrix, true); }
从资源获取位图:
Bitmap source = BitmapFactory.decodeResource(this.getResources(), R.drawable.your_img);
以下是在android中旋转或重新调整图像大小的代码
public class bitmaptest extends Activity { @Override public void onCreate(Bundle icicle) { super.onCreate(icicle); LinearLayout linLayout = new LinearLayout(this); // load the origial BitMap (500 x 500 px) Bitmap bitmapOrg = BitmapFactory.decodeResource(getResources(), R.drawable.android); int width = bitmapOrg.width(); int height = bitmapOrg.height(); int newWidth = 200; int newHeight = 200; // calculate the scale - in this case = 0.4f float scaleWidth = ((float) newWidth) / width; float scaleHeight = ((float) newHeight) / height; // createa matrix for the manipulation Matrix matrix = new Matrix(); // resize the bit map matrix.postScale(scaleWidth, scaleHeight); // rotate the Bitmap matrix.postRotate(45); // recreate the new Bitmap Bitmap resizedBitmap = Bitmap.createBitmap(bitmapOrg, 0, 0, width, height, matrix, true); // make a Drawable from Bitmap to allow to set the BitMap // to the ImageView, ImageButton or what ever BitmapDrawable bmd = new BitmapDrawable(resizedBitmap); ImageView imageView = new ImageView(this); // set the Drawable on the ImageView imageView.setImageDrawable(bmd); // center the Image imageView.setScaleType(ScaleType.CENTER); // add ImageView to the Layout linLayout.addView(imageView, new LinearLayout.LayoutParams( LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT ) ); // set LinearLayout as ContentView setContentView(linLayout); } }
您也可以查看此链接了解详情: http : //www.anddev.org/resize_and_rotate_image_-_example-t621.html
默认情况下,旋转点是canvas的(0,0)点,我的猜测是,你可能想旋转它的中心。 我这样做了:
protected void renderImage(Canvas canvas) { Rect dest,drawRect ; drawRect = new Rect(0,0, mImage.getWidth(), mImage.getHeight()); dest = new Rect((int) (canvas.getWidth() / 2 - mImage.getWidth() * mImageResize / 2), // left (int) (canvas.getHeight()/ 2 - mImage.getHeight()* mImageResize / 2), // top (int) (canvas.getWidth() / 2 + mImage.getWidth() * mImageResize / 2), //right (int) (canvas.getWidth() / 2 + mImage.getHeight()* mImageResize / 2));// bottom if(!mRotate) { canvas.drawBitmap(mImage, drawRect, dest, null); } else { canvas.save(Canvas.MATRIX_SAVE_FLAG); //Saving the canvas and later restoring it so only this image will be rotated. canvas.rotate(90,canvas.getWidth() / 2, canvas.getHeight()/ 2); canvas.drawBitmap(mImage, drawRect, dest, null); canvas.restore(); } }
如果旋转位图,90 180 270 360是可以的,但对于其他度数,canvas将绘制不同大小的位图。
所以,最好的办法是
canvas.rotate(degree,rotateCenterPoint.x,rotateCenterPoint.y); canvas.drawBitmap(...); canvas.rotate(-degree,rotateCenterPoint.x,rotateCenterPoint.y);//rotate back
Kotlin的缩写
fun Bitmap.rotate(degrees: Float): Bitmap { val matrix = Matrix().apply { postRotate(degrees) } return Bitmap.createBitmap(this, 0, 0, width, height, matrix, true) }
和用法:
val rotatedBitmap = bitmap.rotate(90)