android canvas.drawBitmap(visiblePage, 0, 0, paint);
当我添加canvas.rotate(90)
时,没有效果。但如果我写
canvas.rotate(90)
canvas.drawBitmap(visiblePage, 0, 0, paint);
我没有绘制位图。那我该怎么做呢?
答案 0 :(得分:225)
您也可以试试这个
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);
答案 1 :(得分:154)
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);
答案 2 :(得分:18)
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)
答案 3 :(得分:11)
下面是在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
答案 4 :(得分:6)
默认情况下,旋转点是画布的(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();
}
}
答案 5 :(得分:2)
使用Java createBitmap()
方法可以传递学位。
Bitmap bInput /*your input bitmap*/, bOutput;
float degrees = 45; //rotation degree
Matrix matrix = new Matrix();
matrix.setRotate(degrees);
bOutput = Bitmap.createBitmap(bInput, 0, 0, bInput.getWidth(), bInput.getHeight(), matrix, true);
答案 6 :(得分:1)
如果你旋转位图,90 180 270 360就可以了,但是对于其他度数,画布会绘制不同大小的位图。
所以,最好的方法是
canvas.rotate(degree,rotateCenterPoint.x,rotateCenterPoint.y);
canvas.drawBitmap(...);
canvas.rotate(-degree,rotateCenterPoint.x,rotateCenterPoint.y);//rotate back
答案 7 :(得分:1)
我将进一步简化comm1x的 Kotlin扩展功能:
fun Bitmap.rotate(degrees: Float) =
Bitmap.createBitmap(this, 0, 0, width, height, Matrix().apply { postRotate(degrees) }, true)
答案 8 :(得分:0)
如果您的目标是在imageView或文件中使用旋转图像,则可以使用Exif来实现该目标。支持库现在提供:https://android-developers.googleblog.com/2016/12/introducing-the-exifinterface-support-library.html
以下是它的用法,但要实现您的目标,您必须检查库api文档。我只是想提一下旋转位图并不总是最好的方法。
Uri uri; // the URI you've received from the other app
InputStream in;
try {
in = getContentResolver().openInputStream(uri);
ExifInterface exifInterface = new ExifInterface(in);
// Now you can extract any Exif tag you want
// Assuming the image is a JPEG or supported raw format
} catch (IOException e) {
// Handle any errors
} finally {
if (in != null) {
try {
in.close();
} catch (IOException ignored) {}
}
}
int rotation = 0;
int orientation = exifInterface.getAttributeInt(
ExifInterface.TAG_ORIENTATION,
ExifInterface.ORIENTATION_NORMAL);
switch (orientation) {
case ExifInterface.ORIENTATION_ROTATE_90:
rotation = 90;
break;
case ExifInterface.ORIENTATION_ROTATE_180:
rotation = 180;
break;
case ExifInterface.ORIENTATION_ROTATE_270:
rotation = 270;
break;
}
依赖
编译“com.android.support:exifinterface:25.1.0”
答案 9 :(得分:0)
请小心来自comm1x和Gnzlt的java平台调用中的Bitmap类型,因为它可能返回null。我认为,如果参数可以是任何Number并使用infix以提高可读性,这也将更加灵活,具体取决于您的编码风格。
infix fun Bitmap.rotate(degrees: Number): Bitmap? {
return Bitmap.createBitmap(
this,
0,
0,
width,
height,
Matrix().apply { postRotate(degrees.toFloat()) },
true
)
}
如何使用?
bitmap rotate 90
// or
bitmap.rotate(90)