Я использую ПалецКраскаХолстСмотреть от этот образец 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>
Холст имеет прозрачный фон, а параметры макета обоих представлений задаются программно. Таким образом, маркировка работает нормально.
Теперь вопрос в том, как я могу объединить это изображение с холстом маркировки с минимальной потерей качества в отдельный файл (растровое изображение или файл изображения в файловой системе).
Объясню, почему я упомянул о потере качества: Например, изображение на заднем плане имеет размер 1920x1080 с камеры устройства. Дисплей имеет только 1280x800 пикселей. Поскольку я не могу уместить изображение на дисплее, мне нужно отобразить уменьшенную версию, и на этой уменьшенной версии происходит маркировка.
Обновлено:
@ Джо LV:
Это ваша демонстрация без каких-либо изменений, развернутых на моих устройствах:
Я скоро попробую эмулятор Android 8.
Так вот этот метод не работает для API <= 24 :-( (API 25 и 26 не тестировались)
markImageImageView
просто содержит образ, который я загружаю из хранилища устройства (может быть любое изображение)
canvasMarkMeta
- это FingerPaintCanvas из связанного шаблона, который содержит нарисованные линии.
Я был бы очень рад увидеть какой-нибудь демонстрационный код, как объединить две картинки в одну. Как только я вернусь к своему решению, я покажу код, который обрабатывает мои две фотографии (может быть понедельник 07.05.18).
Ниже приведен код, я добавил в него комментарии:
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
.
Спасибо за ответ, Джо. Если я запускаю вашу демонстрацию на своем устройстве, я вижу только отображаемую кнопку паузы, а не объединенное изображение кнопки воспроизведения и паузы. Такое же поведение при применении этого кода в моем решении ...
Привет, на моем устройстве (Google Pixel 8.1) я вижу, что кнопка воспроизведения находится над кнопкой паузы. Если возможно, не могли бы вы предоставить демо? Или вы можете предоставить изображения, markImageImageView
и canvasMarkMeta
, вы можете сохранить их как файл и приложить к своему вопросу.
Вам нужно использовать
PorterDuff.Mode
для объединения двух изображений. Можете ли вы показать коды того, как вы обращались с двумя картинками? Вы можете прочитать это, если это то, что вы хотите, я могу предоставить демонстрацию о том, как объединить два изображения в изображение в качестве ответа для вас.