媒体捕捉 - 手机拍摄的照片很暗

Posted

技术标签:

【中文标题】媒体捕捉 - 手机拍摄的照片很暗【英文标题】:Media Capture - photos taken by phone are dark 【发布时间】:2016-08-30 02:47:42 【问题描述】:

我正在尝试制作当您点击 livetile 时拍照的应用。不幸的是,智能手机存在一些问题:这个应用程序保存的照片完全是黑色的。我不知道我会做错什么。

事实:

    此 UWP 应用可在 PC 上正常运行,问题仅出现在我的 Lumia 设备上 正确检测到相机 这不是livetile的问题:无论我点击livetile还是点击按钮拍照都不起作用 并非所有照片都是全黑的。当我拍摄窗户(由于阳光而明亮)时,我可以看到它模糊的形状。也许照片是正确拍摄的,但它们不知何故变暗了?

要粘贴的代码太多,所以我决定在 GitHub 上发布整个项目。

[LINK TO GITHUB]

您知道为什么它不起作用吗?这段代码大部分是抄自其中一个教程,所以有问题就很奇怪了。

【问题讨论】:

【参考方案1】:

我找到了灵魂:

初始化MediaCapture后,拍照前,需要创建CaptureElement并开始预览。

var captureElement = new CaptureElement();
captureElement.Source = _mediaCapture;

await _mediaCapture.StartPreviewAsync();

Why you need to start previewing

图片较暗通常是由于缺少视频预览。相机驱动程序使用预览流来运行他们的 3A 算法(自动白平衡/对焦/曝光)。

Why you need to create Capture Element

发生此错误 [当您使用不带 CaptureElement 的 StartPreviewAsync 时显示] 因为当前 StartPreviewAsync 需要接收器才能将帧输出到。这可以通过在 xaml 中创建一个捕获元素来显示帧来解决。

【讨论】:

【参考方案2】:

尝试使用这个 sn-p(来自 FingerPaint 应用)在拍摄图像后更改色调或亮度:

    ImageEncodingProperties imageEncodingProps = ImageEncodingProperties.CreateJpeg();
    InMemoryRandomAccessStream memoryStream = new InMemoryRandomAccessStream();
    await _mediaCapture.CapturePhotoToStreamAsync(imageEncodingProps, memoryStream);

        BitmapDecoder decoder = await BitmapDecoder.CreateAsync(memoryStream);
        PixelDataProvider pixelProvider = await decoder.GetPixelDataAsync();
        byte[] pixels = pixelProvider.DetachPixelData();

        for (int index = 0; index < pixels.Length; index += 4)
        
            Color color = Color.FromArgb(pixels[index + 3],
                                         pixels[index + 2],
                                         pixels[index + 1],
                                         pixels[index + 0]);
            HSL hsl = new HSL(color);
            hsl = new HSL(hsl.Hue, 1.0, hsl.Lightness);
            color = hsl.Color;

            pixels[index + 0] = color.B;
            pixels[index + 1] = color.G;
            pixels[index + 2] = color.R;
            pixels[index + 3] = color.A;
        

        WriteableBitmap bitmap = new WriteableBitmap((int)decoder.PixelWidth, 
                                                     (int)decoder.PixelHeight);
        Stream pixelStream = bitmap.PixelBuffer.AsStream();
        await pixelStream.WriteAsync(pixels, 0, pixels.Length);
        bitmap.Invalidate();

        image.Source = bitmap;

【讨论】:

谢谢,但我刚刚找到了更简单的解决方案

以上是关于媒体捕捉 - 手机拍摄的照片很暗的主要内容,如果未能解决你的问题,请参考以下文章

手机怎么拍摄GIF动态照片

手机拍摄的照片怎样显示经纬度?

科尔多瓦相机在访问另一条路线后拍摄照片问题

vsco 媒体不可用

如何使用框架布局拍摄照片?

iPad 拍摄 16:9 照片