Canvas.DrawBitmap неожиданный результат (ошибка или странное поведение) Xamarin Android
Так что у меня проблема с методом Canvas. DrawBitmap (), который рисует неожиданный результат.
Давайте посмотрим мой пример:
Исходное изображение
У меня есть два случая (только для теста):
- Я хочу нарисовать красный прямоугольник из 0,0 и дать ему размер 1/4 изображения, также я хочу нарисовать этот растровый файл в том же размере (1/4) и поместить в Bottom.Right.
- Снова нарисуйте красный прямоугольник с теми же условиями (начинается с Top.Left (0,0) и размером 1/4 изображения) и нарисуйте часть растрового изображения и отобразите его в виде прямоугольника с размером 1/4 (Bottom.Right).
Случай 1
я делаю это:
//source imageview
Source.SetImageResource(Resource.Drawable.lena30);
//bitmap
bt = ((BitmapDrawable)Source.Drawable).Bitmap.Copy(Bitmap.Config.Argb8888, true);
//second imageview, where i fill result
Draw.SetImageBitmap(bt);
can = new Canvas(bt);
Paint paint = new Paint();
paint.Color = Color.Red;
paint.SetStyle(Paint.Style.Fill);
//draw Red Rect with 1/4 size and locate Top.Left
can.DrawRect(0,0,bt.Width/2,bt.Height/2,paint);
//redraw new bitmap(all subset) and locate to Bottom.Right with 1/4 size
can.DrawBitmap(bt, null, new Rect(bt.Width/2, bt.Height / 2, bt.Width, bt.Height), null);
Дело № 2
то же самое, но получая теперь часть растрового изображения (не полное подмножество растрового изображения):
//source imageview
Source.SetImageResource(Resource.Drawable.lena30);
//bitmap
bt = ((BitmapDrawable)Source.Drawable).Bitmap.Copy(Bitmap.Config.Argb8888, true);
//second imageview, where i fill result
Draw.SetImageBitmap(bt);
can = new Canvas(bt);
Paint paint = new Paint();
paint.Color = Color.Red;
paint.SetStyle(Paint.Style.Fill);
//draw Red Rect with 1/4 size and locate Top.Left
can.DrawRect(0,0,bt.Width/2,bt.Height/2,paint);
//redraw new bitmap(not full,only part of Source Rectangle) and locate to Bottom.Right with 1/4 size
can.DrawBitmap(bt, new Rect(bt.Width/2,0,bt.Width,bt.Height), new Rect(bt.Width/2, bt.Height / 2, bt.Width, bt.Height), null);
Так что я не могу понять, почему это происходит?(Почему изображение не масштабируется, чтобы соответствовать размеру и дублировать прямоугольники!?).
Есть идеи? Спасибо!
1 ответ
Проблема в том, что вы рисуете bt
Bitmap
на себя, что заставляет его рекурсивно рисовать, пока не достигнет минимального предела размера. Это займет немного переделки вашего кода, но вам нужно будет создать промежуточный Bitmap
а также Canvas
на котором сделать свой рисунок, а затем установить, что Bitmap
на цель ImageView
,
Source.SetImageResource(Resource.Drawable.lena30);
bt = ((BitmapDrawable) Source.Drawable).Bitmap.Copy(Bitmap.Config.Argb8888, true);
Paint paint = new Paint();
paint.Color = Color.Red;
paint.SetStyle(Paint.Style.Fill);
Canvas canSource = new Canvas(bt);
canSource.DrawRect(0, 0, bt.Width / 2, bt.Height / 2, paint);
Bitmap btDraw = Bitmap.CreateBitmap(bt.Width, bt.Height, Bitmap.Config.Argb8888);
Canvas canDraw = new Canvas(btDraw);
canDraw.DrawBitmap(bt, null, new Rect(0, 0, bt.Width, bt.Height), null);
canDraw.DrawBitmap(bt, null, new Rect(bt.Width / 2, bt.Height / 2, bt.Width, bt.Height), null);
Draw.SetImageBitmap(btDraw);
NB: я никогда не использовал Xamarin, поэтому, пожалуйста, простите любые синтаксические ошибки в моей попытке перевода.