Добавление прозрачности к изображению SKBitmap приводит к черному фону - PullRequest
0 голосов
/ 29 апреля 2020

В настоящее время у меня возникает проблема с отображением прозрачного изображения в представлении Xamarin.Forms Image.

  1. Изображение извлекается из галереи и преобразуется в формат PNG.
  2. Пиксели повторяются, и для некоторых из них их альфа-значение корректируется.
  3. Растровое изображение преобразуется в SKBitmapImageSource и отображается в виде изображения.

Результат (вверху) и оригинал (внизу), взято Android: Снимок экрана

Цель - показать изображение с прозрачным фоном, но я не могу заставить его работать. Он продолжает показывать на черном фоне. Загрузка прозрачного файла PNG из inte rnet работает, поэтому что-то в процессе преобразования или обработки изображения должно go неправильно.

Поиск и преобразование изображения:

SKBitmap source = SKBitmap.Decode(file.GetStream());
SKData data = SKImage.FromBitmap(source).Encode(SKEncodedImageFormat.Png, 100);
SKBitmap converted = SKBitmap.Decode(data);
SKBitmap result = ImageProcessor.AddTransparency(converted, 0.7f);

Добавлена ​​прозрачность :

    public static SKBitmap AddTransparency(SKBitmap bitmapSource, float treshold)
    {
        if (bitmapSource == null)
        {
            throw new ArgumentNullException(nameof(bitmapSource), $"{nameof(bitmapSource)} is null.");
        }

        var bitmapTarget = bitmapSource.Copy();

        // Calculate the treshold as a number between 0 and 255
        int value = (int)(255 * treshold);

        // loop trough every pixel
        int width = bitmapTarget.Width;
        int height = bitmapTarget.Height;

        for (int row = 0; row < height; row++)
        {
            for (int col = 0; col < width; col++)
            {
                var color = bitmapTarget.GetPixel(col, row);

                if (color.Red > value && color.Green > value && color.Blue > value)
                {
                    bitmapTarget.SetPixel(col, row, color.WithAlpha(0x00));
                }
            }
        }

        return bitmapTarget;
    }

Преобразование в источник изображения:

return SKBitmapImageSource.FromStream(SKImage.FromBitmap((SKBitmap)value).Encode().AsStream);

1 Ответ

0 голосов
/ 02 мая 2020

Проблема в том, что AlphaType установлен неправильно. Для того, как вы делаете альфа-преобразование, AlphaType должен быть установлен в AlphaType.Premul

Поскольку это свойство только для чтения, скопируйте растровое изображение в новое и установите правильный альфа-тип

...