Android - 旋转图像的一部分

时间:2017-10-18 20:18:07

标签: android image-processing imageview

我基本上需要在ImageView(例如)

的一小部分旋转90度

example

在上图中,我想旋转4以便正确显示。只有4,其余应保持垂直。

我有办法实现吗?

通过实施MikeM建议的方法。我得到了以下结果。

result

正如您所看到的,我需要解决两件大事:

  1. 旋转的方块正在工作,但处于扭转位置。我如何找到4
  2. 的确切坐标
  3. 图像的背景已变为黑色。它过去是透明的

1 个答案:

答案 0 :(得分:2)

如果您知道或可以计算出您想要旋转的区域的坐标和尺寸,那么这个过程相对简单。

  1. 将图片加载为可变Bitmap
  2. 从原始区域创建第二个,旋转Bitmap所需区域。
  3. 在原始Canvas上创建Bitmap
  4. 如有必要,清除裁剪区域。
  5. 将旋转的区域绘制回原始区域。
  6. 在以下示例中,假设区域的坐标(xy)和尺寸(widthheight)已知。

    // Options necessary to create a mutable Bitmap from the decode
    BitmapFactory.Options options = new BitmapFactory.Options();
    options.inMutable = true;
    
    // Load the Bitmap, here from a resource drawable
    Bitmap bmp = BitmapFactory.decodeResource(getResources(), resId, options);
    
    // Create a Matrix for 90° counterclockwise rotation
    Matrix matrix = new Matrix();
    matrix.postRotate(-90);
    
    // Create a rotated Bitmap from the desired region of the original
    Bitmap region = Bitmap.createBitmap(bmp, x, y, width, height, matrix, false);
    
    // Create our Canvas on the original Bitmap
    Canvas canvas = new Canvas(bmp);
    
    // Create a Paint to clear the clipped region to transparent
    Paint paint = new Paint();
    paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));
    
    // Clear the region
    canvas.drawRect(x, y, x + width, y + height, paint);
    
    // Draw the rotated Bitmap back to the original,
    // concentric with the region's original coordinates
    canvas.drawBitmap(region, x + width / 2f - height / 2f, y + height / 2f - width / 2f, null);
    
    // Cleanup the secondary Bitmap
    region.recycle();
    
    // The resulting image is in bmp
    imageView.setImageBitmap(bmp);
    

    解决编辑中的问题:

    1. 原始示例中的旋转区域图形基于长轴垂直的图像。在区域被修改后,编辑中的图像已旋转为垂直

    2. 黑色背景是由于将生成的图像插入MediaStore,后者以JPEG格式保存图像,不支持透明度。