SkiaSharp Mirror Bitmap - PullRequest
       20

SkiaSharp Mirror Bitmap

0 голосов
/ 28 августа 2018

Я хочу отразить растровое изображение так, чтобы у меня было изображение и его зеркало рядом друг с другом. Я использую SkiaSharp, и мои растровые изображения - SKBitmap, и я рисую их на холсте.

canvas.Translate( -imageWidth/ 2.0f, -imageHeight/ 2.0f );
canvas.Scale( -1, 1,0,0 );
canvas.DrawBitmap( bitmap, new SKPoint( 0.0f, 0.0f ) );
canvas.Scale( -1, 1, 0, 0 );
canvas.Translate( imageWidth/ 2.0f, imageHeight / 2.0f );

Я центрирую изображение вокруг источника, зеркально отражаю его вокруг оси Y, рисую растровое изображение на холсте, затем отменяю преобразования, чтобы получить результат.

Кажется, моя проблема в том, что растровое изображение просто исчезает, когда я начинаю играть с методом масштабирования. Этого не происходит, если я рисую что-то вроде круга.

1 Ответ

0 голосов
/ 10 сентября 2018

Это потому, что вы действительно хотите сделать наоборот. Рисование в SkiaSharp происходит путем преобразования матрицы, а затем рисования с использованием этого.

Ваш код фактически запрашивает это: - переместить источник за пределы экрана (влево и вверх) на половину ширины и высоты растрового изображения - перевернуть начало координат по оси Y (это заставит правую сторону изображения перевернуть в крайнее левое положение) - нарисуйте изображение с верхним левым краем в начале координат (прямо сейчас в крайнем левом углу экрана)

То, что вы хотите сделать, это наоборот, но есть и быстрый способ перевернуть матрицу в центре:

canvas.Scale(-1, 1, imageWidth / 2.0f, 0);
canvas.DrawBitmap(bitmap, 0, 0);

Чтобы сделать это в отдельных операциях, вам просто нужно перевести все изображение вправо, а затем перевернуть:

canvas.Translate(imageWidth , 0);
canvas.Scale(-1, 1, 0, 0);

Кроме того, чтобы избежать смешанных преобразований и необходимости отмены всего, просто оберните их в SKAutoCanvasRestore (или просто используйте методы Save и Restore):

using(new SKAutoCanvasRestore(canvas, true))
{
   // transform and draw . . .
}
...