Вот решение, которое я придумал:
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;
}
Возможно, он использует некоторые оптимизации, но после нескольких тестов, похоже, работает.