这里的旋转不讨论图片在imageView中的旋转问题,只是单纯的涉及一个图片bitmap的旋转 或者在一个自定义View中的旋转,虽然旋转很容易实现,但是旋转多次之后图片的质量却是个问题,有时候的效果是不看入目的,虽然对于我的项目基本上多次旋转还算比较符合原图但是 质量却是有点变,还没有发现毫无变化的,在不同的情况下使用不同的方法也会产生不同的效果,至于原因我也不是很明白,这里呢可以讨论一下:
旋转主要两种方式:
Matrix mt = new Matrix();
mt.postRotate(degree);
Bitmap bitmap = CreateBitmap(src, 0, 0, w, h, mt, true);
canvs.drawBitmap(bitmap, 0, 0, paint);
2
canvas.save();
canvas.rotate(degree);
canvas.drawBitmap(bitmap, 0, 0, paint);
canvas.restore(); 这里的canvas是ondraw里面的
在这两种方法上可以相互揉搓 产生另外一种新的方法也就是canvas本身自己实例话,但是不是在ondraw里使用。如;
Bitmap targetBitmap = Bitmap.createBitmap(targetWidth, targetHeight, config); Canvas canvas = new Canvas(targetBitmap); Matrix matrix = new Matrix(); matrix.setRotate(mRotation,source.getWidth()/2,source.getHeight()/2); canvas.drawBitmap(source, matrix, new Paint());
Matrix matrix = new Matrix();
matrix.setRotate(mRotation,source.getWidth()/2,source.getHeight()/2); RectF rectF = new RectF(0, 0, source.getWidth(), source.getHeight()); matrix.mapRect(rectF); Bitmap targetBitmap = Bitmap.createBitmap(rectF.width(), rectF.height(), config); Canvas canvas = new Canvas(targetBitmap); canvas.drawBitmap(source, matrix, new Paint());
这两种方法都有一个paint 可以消除锯齿的属性,但是有时效果不理想Paint p = new Paint(Paint.ANTI_ALIAS_FLAG);
不过在旋转的时候一定要注意旋转的中心点 一般饶图片中心旋转效果比饶左上角要好
preRotate(turnDegrees, width/2, height/2);
Matrix transform = new Matrix(); transform.setTranslate(xOfCentre, yOfCentre); transform.preRotate(turnDegrees, width/2, height/2); canvas.drawBitmap(bitmap, transform, null);
这些方法需要自己在不同的场合去摸索,想保存图片质量出了考虑上述元素外,还应该考虑你得bitmap的出处,如bitmap。compress方法,已经option 当中几个属性的设计,这些因素综合上 自己在实际中进行调试是可以达到理想效果的。如果有更好的方式还请留言