Xamarin.Andoid: объединить ImageView с CanvasView

Я использую ПалецКраскаХолстСмотреть от этот образец xamarin.

Я работаю с 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>

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

Xamarin.Andoid: объединить ImageView с CanvasView

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

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

Обновлено:

@ Джо LV:

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

Lenovo Yoga 3, Android 6.0.1Xamarin.Andoid: объединить ImageView с CanvasView

Huawei Honor 8, Android 7.0Xamarin.Andoid: объединить ImageView с CanvasView

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

Pixel 2XL, Android 8.1Xamarin.Andoid: объединить ImageView с CanvasView

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

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

Вам нужно использовать PorterDuff.Mode для объединения двух изображений. Можете ли вы показать коды того, как вы обращались с двумя картинками? Вы можете прочитать это, если это то, что вы хотите, я могу предоставить демонстрацию о том, как объединить два изображения в изображение в качестве ответа для вас.

Robbit 04.05.2018 14:02

Я был бы очень рад увидеть какой-нибудь демонстрационный код, как объединить две картинки в одну. Как только я вернусь к своему решению, я покажу код, который обрабатывает мои две фотографии (может быть понедельник 07.05.18).

Aiko West 04.05.2018 14:18
0
2
199
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

   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.

Спасибо за ответ, Джо. Если я запускаю вашу демонстрацию на своем устройстве, я вижу только отображаемую кнопку паузы, а не объединенное изображение кнопки воспроизведения и паузы. Такое же поведение при применении этого кода в моем решении ...

Aiko West 07.05.2018 08:57

Привет, на моем устройстве (Google Pixel 8.1) я вижу, что кнопка воспроизведения находится над кнопкой паузы. Если возможно, не могли бы вы предоставить демо? Или вы можете предоставить изображения, markImageImageView и canvasMarkMeta, вы можете сохранить их как файл и приложить к своему вопросу.

Robbit 07.05.2018 09:08

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