Canvas.DrawBitmap неожиданный результат (ошибка или странное поведение) Xamarin Android

Так что у меня проблема с методом Canvas. DrawBitmap (), который рисует неожиданный результат.
Давайте посмотрим мой пример:
Исходное изображение
образ


У меня есть два случая (только для теста):

  1. Я хочу нарисовать красный прямоугольник из 0,0 и дать ему размер 1/4 изображения, также я хочу нарисовать этот растровый файл в том же размере (1/4) и поместить в Bottom.Right.
  2. Снова нарисуйте красный прямоугольник с теми же условиями (начинается с 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);  

и результат:
результат case1


Дело № 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);  

результат case2


Так что я не могу понять, почему это происходит?(Почему изображение не масштабируется, чтобы соответствовать размеру и дублировать прямоугольники!?).
Есть идеи? Спасибо!

1 ответ

Решение

Проблема в том, что вы рисуете btBitmap на себя, что заставляет его рекурсивно рисовать, пока не достигнет минимального предела размера. Это займет немного переделки вашего кода, но вам нужно будет создать промежуточный 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, поэтому, пожалуйста, простите любые синтаксические ошибки в моей попытке перевода.

Другие вопросы по тегам