如何旋转位图90度

在 android canvas.drawBitmap(visiblePage, 0, 0, paint);中有一个语句

当我添加 canvas.rotate(90)时,没有效果。但是如果我写

canvas.rotate(90)
canvas.drawBitmap(visiblePage, 0, 0, paint);

我没有得到位图绘制。那么我做错了什么?

199439 次浏览

下面是在 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

你也可以试试这个

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.setImageBitmap(rotatedBitmap);
Bitmap source = BitmapFactory.decodeResource(this.getResources(), R.drawable.your_img);


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);
}

默认情况下,旋转点是画布的(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();
}
}

如果您旋转位图,90180270360是可以的,但对于其他度画布将绘制不同大小的位图。

所以,最好的办法是

canvas.rotate(degree,rotateCenterPoint.x,rotateCenterPoint.y);
canvas.drawBitmap(...);
canvas.rotate(-degree,rotateCenterPoint.x,rotateCenterPoint.y);//rotate back

科特林的简短分机

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(90f)

如果您的目标是有一个旋转的图像在一个 image 视图或文件,您可以使用 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”

我会更简化 Com1xKotlin 扩展函数:

fun Bitmap.rotate(degrees: Float) =
Bitmap.createBitmap(this, 0, 0, width, height, Matrix().apply { postRotate(degrees) }, true)

只是要小心来自 Java 平台调用的 Bitmap 类型,比如来自 Com1xGnzlt的回答,因为它可能返回 null。我认为它也更灵活,如果参数可以是任何数字和使用中缀的可读性,这取决于您的编码风格。

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)

使用 JavacreateBitmap()方法可以传递度。

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);