Android实现图片旋转的步骤

流程图

flowchart TD
    A[开始] --> B{导入图片}
    B --> C{选择旋转角度}
    C --> D[旋转图片]
    D --> E[保存旋转后的图片]
    E --> F[结束]

代码实现

导入图片

首先,我们需要导入一张图片作为旋转的对象。可以通过从相册选择图片或者拍摄照片获取图片的路径。

private String imagePath;

private void importImage() {
    Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
    intent.setType("image/*");
    startActivityForResult(intent, SELECT_IMAGE_REQUEST_CODE);
}

@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == SELECT_IMAGE_REQUEST_CODE && resultCode == RESULT_OK) {
        if (data != null && data.getData() != null) {
            Uri imageUri = data.getData();
            imagePath = getImagePathFromUri(imageUri);
        }
    }
}

private String getImagePathFromUri(Uri imageUri) {
    String[] projection = {MediaStore.Images.Media.DATA};
    Cursor cursor = getContentResolver().query(imageUri, projection, null, null, null);
    if (cursor != null) {
        int columnIndex = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
        cursor.moveToFirst();
        String path = cursor.getString(columnIndex);
        cursor.close();
        return path;
    }
    return null;
}

选择旋转角度

接下来,我们需要让用户选择旋转的角度。可以通过一个对话框来展示可选的角度,并提供一个滑动条供用户选择。

private int rotationAngle;

private void selectRotationAngle() {
    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    builder.setTitle("选择旋转角度");
    final SeekBar seekBar = new SeekBar(this);
    seekBar.setMax(360);
    builder.setView(seekBar);
    builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialogInterface, int i) {
            rotationAngle = seekBar.getProgress();
            rotateImage();
        }
    });
    builder.setNegativeButton("取消", null);
    builder.show();
}

旋转图片

在确定了旋转角度后,我们可以使用Matrix类来进行图片的旋转操作。

private void rotateImage() {
    Bitmap originalBitmap = BitmapFactory.decodeFile(imagePath);
    Matrix matrix = new Matrix();
    matrix.postRotate(rotationAngle);
    Bitmap rotatedBitmap = Bitmap.createBitmap(originalBitmap, 0, 0, originalBitmap.getWidth(), originalBitmap.getHeight(), matrix, true);
    imageView.setImageBitmap(rotatedBitmap);
}

保存旋转后的图片

最后,我们需要将旋转后的图片保存到手机相册中。

private void saveRotatedImage() {
    Bitmap rotatedBitmap = ((BitmapDrawable) imageView.getDrawable()).getBitmap();
    String rotatedImagePath = getExternalFilesDir(Environment.DIRECTORY_PICTURES) + File.separator + "rotated_image.jpg";
    try {
        FileOutputStream outputStream = new FileOutputStream(rotatedImagePath);
        rotatedBitmap.compress(Bitmap.CompressFormat.JPEG, 100, outputStream);
        outputStream.flush();
        outputStream.close();
        Toast.makeText(this, "图片已保存至:" + rotatedImagePath, Toast.LENGTH_SHORT).show();
    } catch (Exception e) {
        e.printStackTrace();
        Toast.makeText(this, "保存图片失败", Toast.LENGTH_SHORT).show();
    }
}

状态图

stateDiagram
    [*] --> 导入图片
    导入图片 --> 选择旋转角度
    选择旋转角度 --> 旋转图片
    旋转图片 --> 保存旋转后的图片
    保存旋转后的图片 --> [*]