Как обрезать повернутое изображение в xamarin Android?

#c# #android #xamarin.android #image-rotation

#c# #Android #xamarin.android #вращение изображения

Вопрос:

Мое требование — обрезать изображение после поворота.

Пример: https://github.com/SanthiyaArulsamy/Samples/tree/master/RotationSample

Мое фактическое изображение:

введите описание изображения здесь

После поворота:

Здесь я повернул изображение на 45 градусов. Теперь я хочу обрезать только выделенную (прямоугольник красного цвета) прямоугольную область. введите описание изображения здесь

Код:

         var cropWindowRect = new System.Drawing.RectangleF(100, 100, 500, 500);

        var points = new float[8]
        {
                cropWindowRect.Left, cropWindowRect.Top,
                cropWindowRect.Right, cropWindowRect.Top,
                cropWindowRect.Right, cropWindowRect.Bottom,
                cropWindowRect.Left, cropWindowRect.Bottom
        };
        this.imageView.SetImageBitmap(GetCroppedBitmap(imageBitmap, points));
        this.imageView.SetScaleType(ImageView.ScaleType.FitCenter);
        this.imageView.Rotation = 0;

  private static Rect GetRect(float[] points, int imagewidth, int imageheight)
    {
        int left = (int)Math.Round(Math.Max(0, Math.Min(Math.Min(Math.Min(points[0], points[2]), points[4]), points[6])));
        int top = (int)Math.Round(Math.Max(0, Math.Min(Math.Min(Math.Min(points[1], points[3]), points[5]), points[7])));
        int right = (int)Math.Round(Math.Min(imagewidth, Math.Max(Math.Max(Math.Max(points[0], points[2]), points[4]), points[6])));
        int bottom = (int)Math.Round(Math.Min(imageheight, Math.Max(Math.Max(Math.Max(points[1], points[3]), points[5]), points[7])));
        return new Rect(left, top, right, bottom);
    }
    private static Bitmap GetCroppedBitmap(Bitmap bitmap, float[] points)
    {
        Rect rect = GetRect(points, bitmap.Width, bitmap.Height);
        var height = rect.Height();
        var width = rect.Width();
        if (rect.Height()   rect.Top > bitmap.Height)
            height = bitmap.Height - rect.Top;
        if (rect.Width()   rect.Left > bitmap.Width)
            width = bitmap.Width - rect.Left;
        if (width > 0 amp;amp; height > 0)
            return Bitmap.CreateBitmap(bitmap, rect.Left, rect.Top, width, height);
        else
            return bitmap;
    }
  

Пожалуйста, подскажите мне, как найти точки координат изображения после поворота.

Ответ №1:

Вы можете обрезать вид экрана и настроить его рамку.

Например, CustomShot метод следующим образом:

 public Bitmap CustomShot(Activity activity, int x, int y, int w, int h)
{
    // get the top view of windows
    View view = activity.Window.DecorView;
    view.BuildDrawingCache();

    // get the height of status bar
    Rect rect = new Rect();
    view.GetWindowVisibleDisplayFrame(rect);
    int statusBarHeights = rect.Top;
    Display display = activity.WindowManager.DefaultDisplay;

    // get the width and height of screen
    if (w == 0)
    {
        w = display.Width;
    }
       
    int heights = display.Height;

    // allow cache
    view.DrawingCacheEnabled = true;

    // custom the crop frame
    Bitmap bmp = Bitmap.CreateBitmap(view.GetDrawingCache(true), x,
            y, w, h);

    // clear cache
    view.DestroyDrawingCache();

    return bmp;
}
  

Затем используется в Cropbutton_Click методе следующим образом:

 private void Cropbutton_Click(object sender, System.EventArgs e)
{
    if(imageBitmap == null){
        imageBitmap = ViewToBitmap();
        this.imageView.SetImageBitmap(GetCroppedBitmap(imageBitmap, points));
    }else{
        this.imageView.SetImageBitmap(CustomShot( this, 0, 300, 0, 500));
        this.imageView.SetScaleType(ImageView.ScaleType.FitCenter);
        this.imageView.Rotation = 0;
    }
}
  

Эффект:

введите описание изображения здесь