в Win2d, как скопироватьPixelsFromBitmap () в другой canvasBitmap из указанной области в CanvasDrawingSession?

Что я пробовал?

        IRandomAccessStream random = await RandomAccessStreamReference.CreateFromUri(new Uri("ms-appx:///Assets//img.jpg")).OpenReadAsync();
        BitmapTransform bitmapTransform = new BitmapTransform();
        bitmapTransform.ScaledHeight = 250;
        bitmapTransform.ScaledWidth = 500;
        BitmapDecoder decoder = await BitmapDecoder.CreateAsync(random);
        PixelDataProvider pixelProvider = await decoder.GetPixelDataAsync(
            BitmapPixelFormat.Bgra8,
            BitmapAlphaMode.Ignore,
            bitmapTransform,
            ExifOrientationMode.IgnoreExifOrientation,
            ColorManagementMode.DoNotColorManage
            );
        byte[] PixelData = pixelProvider.DetachPixelData();
        CanvasBitmap cb = CanvasBitmap.CreateFromBytes(sender, PixelData, 500, 250, Windows.Graphics.DirectX.DirectXPixelFormat.B8G8R8X8UIntNormalized);

        CanvasBitmap cb1 = null;
        cb.CopyPixelsFromBitmap(cb1, 0,0,100,100,(int)cb.GetBounds(sender).Width,(int) cb.GetBounds(sender).Height);

Но метод copyPixelsFromBitmap () выдает такую ​​ошибку ...

введите описание изображения здесь

Я не знаю, как это решить. Может ли кто-нибудь мне помочь?


person PremKumar Shanmugam    schedule 12.05.2020    source источник
comment
Здравствуйте, вы установили cb1 в значение null, тогда у него нет пикселей, CopyPixelsFromBitmap должен сообщать об ошибках параметров. Вы хотите скопировать картинки?   -  person Richard Zhang - MSFT    schedule 13.05.2020
comment
ага .... Хочу скопировать указанные пиксели региона cb в cb1.Как это сделать?   -  person PremKumar Shanmugam    schedule 13.05.2020


Ответы (1)


Чтобы удовлетворить ваши потребности, мы рекомендуем CanvasRenderTarget. Это производный класс от CanvasBitmap и может создавать новый экземпляр.

async Task<CanvasBitmap> GetImage(CanvasControl sender)
{
    IRandomAccessStream random = await RandomAccessStreamReference.CreateFromUri(new Uri("ms-appx:///Assets//img.jpg")).OpenReadAsync();
    BitmapTransform bitmapTransform = new BitmapTransform();
    bitmapTransform.ScaledHeight = 250;
    bitmapTransform.ScaledWidth = 500;
    BitmapDecoder decoder = await BitmapDecoder.CreateAsync(random);
    PixelDataProvider pixelProvider = await decoder.GetPixelDataAsync(
        BitmapPixelFormat.Bgra8,
        BitmapAlphaMode.Ignore,
        bitmapTransform,
        ExifOrientationMode.IgnoreExifOrientation,
        ColorManagementMode.DoNotColorManage
        );
    byte[] PixelData = pixelProvider.DetachPixelData();
    CanvasBitmap cb = CanvasBitmap.CreateFromBytes(sender, PixelData, 500, 250, DirectXPixelFormat.B8G8R8A8UIntNormalized);
    var target = new CanvasRenderTarget(sender, 100, 100, img.Dpi,DirectXPixelFormat.B8G8R8A8UIntNormalized,CanvasAlphaMode.Premultiplied);
    target.CopyPixelsFromBitmap(cb, 0, 0, 100, 100, 100, 100);
    return target;
}

Проще говоря, он будет смещен на расстояние 100hx100w, создавая область размером 100x100 пикселей на основе cb для отображения пикселей захваченного изображения.

Следует отметить, что создание CanvasRenderTarget должно поддерживать тот же формат пикселей, что и загруженный CanvasBitmap. В исходном вопросе использовался тип пикселя B8G8R8X8UIntNormalized, рекомендуется изменить его на B8G8R8A8UIntNormalized, поскольку первый не поддерживается в CanvasRenderTarget.

person Richard Zhang - MSFT    schedule 13.05.2020