Как проверить прозрачность указанного c пикселя - PullRequest
0 голосов
/ 06 февраля 2020

Как проверить, является ли пиксель в указанной c точке на BitmapImage прозрачным?

Это легко, если использовать WriteableBitmapEx или использовать некоторые вещи WPF, но это не так супер ясно в UWP.

Первым шагом будет получение информации для каждого пикселя, затем проверка определенного пикселя c (или итерация по ним при необходимости). Тогда вы проверите альфа-значение. Как бы вы go действительно сделали это?

1 Ответ

0 голосов
/ 06 февраля 2020

Вот решение, которое я придумал:

public static async Task<bool> IsPixelTransparent(Point hitPosition, BitmapImage sourceImage)
{
        IRandomAccessStream randomStream = await RandomAccessStreamReference.CreateFromUri(sourceImage.UriSource).OpenReadAsync();
        randomStream.Seek(0);

        BitmapDecoder decoder = await BitmapDecoder.CreateAsync(randomStream);
        PixelDataProvider pixelData = await decoder.GetPixelDataAsync();
        byte[] Pixels = pixelData.DetachPixelData();

        int rowWidth = (int)decoder.PixelWidth * 4;
        int rowOffset = hitPosition.Y * rowWidth;
        int colOffset = hitPosition.X * 4;
        int totalOffset = rowOffset + colOffset;

        byte alpha = Pixels[totalOffset + 3];

        return alpha == 0;
}

Возможно, он использует некоторые оптимизации, но после нескольких тестов, похоже, работает.

...