【问题标题】:How to adjust the brightness of an Image efficiently如何有效地调整图像的亮度
【发布时间】:2019-01-10 14:49:07
【问题描述】:

有人知道在 UWP 运行时调整图像亮度的更有效方法吗?

我发现this question 运行良好,但运行速度非常慢。 但是,我在网上找不到任何说明存在替代方法的文档。

这是我有问题的代码。

// TODO Make Image Brightness Slider quicker and more intuitive. 
private WriteableBitmap ChangeBrightness(WriteableBitmap source, int increment)
{
    var dest = new WriteableBitmap(source.PixelWidth, source.PixelHeight);

    byte[] color = new byte[4];

    using (var srcBuffer = source.PixelBuffer.AsStream())
    using (var dstBuffer = dest.PixelBuffer.AsStream())
    {
        while (srcBuffer.Read(color, 0, 4) > 0)
        {
            for (int i = 0; i < 3; i++)
            {
                var value = (float)color[i];
                var alpha = color[3] / (float)255;
                value /= alpha;
                value += increment;
                value *= alpha;

                if (value > 255)
                {
                    value = 255;
                }

                color[i] = (byte)value;
            }

            dstBuffer.Write(color, 0, 4);
        }
    }

    return dest;
}

【问题讨论】:

  • 你也可以使用像ImageProcessor这样的库。或者查看adjusting brightness的源码
  • @LennartStoop 该特定库不适用于 UWP 应用。我正在查看其他几个库,所以如果我找到一个符合要求的库,我会报告。
  • @IshaanJavali 这不是重复的,因为它们是两种不同的技术,并且该问题中提供的答案不适用于 UWP。
  • 抱歉,我错过了 UWP 部分。所以没有System.Drawing给你..你看过Win2D吗?根据文档,它可以处理adjusting brightness。不过我没有这方面的经验

标签: c# uwp writeablebitmap


【解决方案1】:

这可能有效。我没有测试它:

    private async Task<WriteableBitmap> ChangeBrightness(WriteableBitmap source, float increment)
    {
        var canvasBitmap = CanvasBitmap.CreateFromBytes(CanvasDevice.GetSharedDevice(), source.PixelBuffer,
            source.PixelWidth, source.PixelHeight, DirectXPixelFormat.B8G8R8A8UIntNormalized);

        var brightnessFx = new BrightnessEffect
        {
            Source = canvasBitmap,
            BlackPoint = new Vector2(0, increment)
        };

        var crt = new CanvasRenderTarget(CanvasDevice.GetSharedDevice(), source.PixelWidth, source.PixelHeight, 96);

        using (var ds = crt.CreateDrawingSession())
        {
            ds.DrawImage(brightnessFx);
        }

        crt.GetPixelBytes(source.PixelBuffer);

        return source;
    }

你必须参考win2d nuget

【讨论】:

  • 这对我 +1 非常有效。不过请注意,增量需要是 0 和 1 之间的双精度值。因此,您需要获取 Slider.Value 并除以 Slider.Maximum 以获得所需的值。此外,您不需要引用 Win2d,因为它现在都包含在 Microsoft.Graphics.Canvas 中。谢谢!
  • FWIW,如果您只想保存它,甚至显示它,将其转换回 WriteableBitmap 是浪费时间。您可以直接使用 CanvasBitmap 完成这两件事。理想情况下,您还应该在处理完 CanvasRenderTarget 和 CanvasBitmap 后处理它们——它们都实现了 IDisposable。 (作为旁注,Microsoft.Graphics.Canvas 实际上来自 Win2D 库)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-03-26
  • 2017-03-05
  • 2011-03-08
  • 1970-01-01
  • 1970-01-01
  • 2021-08-20
  • 2023-04-07
相关资源
最近更新 更多