Xamarin.Andoid: объединить ImageView с CanvasView - PullRequest
0 голосов
/ 02 мая 2018

Я использую FingerPaintCanvasView из этого образца ксамарина .

Я работаю с 2 слоя . Первый слой - ImageView , на котором я хочу рисовать. Второй слой - PaintCanvasView для рисования.

  <RelativeLayout
    android:layout_height="match_parent"
    android:layout_width="match_parent">
    <ImageView
      android:id="@+id/markImageImageView"
      android:layout_height="wrap_content"
      android:layout_width="wrap_content"/>
    <fingerpaint.FingerPaintCanvasView
      android:id="@+id/canvasMarkMeta"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content" />
  </RelativeLayout>

Холст имеет прозрачный фон, а параметры макета обоих видов задаются программно. Таким образом, маркировка работает нормально.

enter image description here

Теперь вопрос в том, как я могу объединить этот вид изображения с холстом маркировки с минимально возможной потерей качества в отдельный файл (растровое изображение или файл изображения в FileSystem).

Позвольте мне объяснить, почему я упомянул о потере качества: Например, изображение на заднем плане имеет размер 1920x1080 от камеры устройства. Дисплей имеет только 1280x800 пикселей. Так как я не могу разместить изображение на дисплее, мне нужно отобразить уменьшенную версию И пометка происходит в уменьшенной версии.

EDIT:

@ Джо ЛВ:

Это ваше демо без изменений, развернутых на моих устройствах:

Lenovo Yoga 3, Android 6.0.1 enter image description here

Huawei Honor 8, Android 7.0 enter image description here

Скоро попробую эмулятор Android 8.

Пиксель 2XL, Android 8.1 enter image description here

Так что этот метод не работает для API <= 24 </strong> :-( (API 25 и 26 не тестировались)

markImageImageView просто содержит изображение, которое я загружаю из хранилища устройства (может быть любое изображение) canvasMarkMeta - это FingerPaintCanvas из связанного шаблона, который содержит нарисованные линии.

1 Ответ

0 голосов
/ 07 мая 2018

Ниже приведен код, я добавил комментарии:

   public class MainActivity : Activity
    {
        private Rect mSrcRect, mDestRect;
        protected override void OnCreate(Bundle savedInstanceState)
        {
            base.OnCreate(savedInstanceState);

            // Set our view from the "main" layout resource
            SetContentView(Resource.Layout.Main);
            //your background picture ---markImageImageView
            Bitmap background = BitmapFactory.DecodeResource(Resources, Resource.Drawable.pause);
            //your foreground picture ---FingerPaintCanvasView
            Bitmap foreground = BitmapFactory.DecodeResource(Resources, Resource.Drawable.play);

            Paint p = new Paint();
            p.SetXfermode(new PorterDuffXfermode(PorterDuff.Mode.SrcOver));

            //use background to create a canvas
            Bitmap workingBitmap = Bitmap.CreateBitmap(background);
            Bitmap mutableBitmap = workingBitmap.Copy(Bitmap.Config.Argb8888, true);
            Canvas c = new Canvas(mutableBitmap);

            int mBWith = background.Width;
            int mBHeight = background.Height;

            int mFWith = foreground.Width;
            int mFHeight = foreground.Height;
            mSrcRect = new Rect(0, 0, mBWith, mBHeight);
            mDestRect = new Rect(0, 0, mFWith, mFHeight);

            //draw foreground on the backaground, then they will be single bitmap
            c.DrawBitmap(foreground, mSrcRect, mDestRect, p);
            ImageView imageView = FindViewById<ImageView>(Resource.Id.iv);
            imageView.SetImageBitmap(mutableBitmap);
        }
    }

И я должен предоставить демо на github.

Обновление:

Изменить Bitmap.Config.Argb4444 на Bitmap.Config.Argb8888.

...