#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;
}
}
Эффект: