不支持UWP BitmapEncoder SetProperties

时间:2016-06-01 18:32:13

标签: c# c++ graphics directx uwp

所以我正在创建一个UWP应用程序,需要将文本和图像写入图像文件并保存。我目前使用this source在C ++中创建了一个D2D包装器,然后使用C#包装器,它只是让你在不错的C#代码中访问C ++类的功能(除了访问WINMD C ++包装器之外别无其他)。 / p>

但是,在我们将图像和文字写入流后,我们需要能够保存包含EXIF标题的文件,其中包含有关旋转和位置的信息。

我们正在使用encoder.BitmapProperties.SetPropertiesAsync来完成此任务,但它会返回:

Exception thrown: 'System.Exception' in Tester.exe

Additional information: The operation is unsupported. (Exception from HRESULT: 0x88982F81)

没有内部异常,堆栈跟踪是:

   at Windows.Graphics.Imaging.BitmapEncoder.get_BitmapProperties()
   at Tester.ViewModels.<_SaveImageWithPropertiesAsync>d__56.MoveNext()

我想尽量避免手动添加标题,因为我担心来自D2DContext的返回流不包含任何标题信息或其他内容,因此它无法向其追加任何内容。

以下是我的代码的相关部分:

C ++

同样,您可以找到原始来源here

IRandomAccessStream^ D2DWrapper::EndDraw()
{
    DX::ThrowIfFailed(
        m_d2dContext->EndDraw()
    );

    // If needPreview is true, we return a valid IRandomAccessStream reference.

    GUID wicFormat = GUID_ContainerFormatBmp;
    ComPtr<IStream> stream;
    ComPtr<ISequentialStream> ss;
    auto inMemStream = ref new InMemoryRandomAccessStream();
    DX::ThrowIfFailed(
        CreateStreamOverRandomAccessStream(inMemStream, IID_PPV_ARGS(&stream))
        );

    SaveBitmapToStream(m_targetBitmap, m_wicFactory, m_d2dContext, wicFormat, stream.Get());

    return inMemStream;

}

C#Wrapper

public IRandomAccessStream EndDraw() {
    return _context.EndDraw()
}

C#Tester

async Task _SaveImageWithPropertiesAsync(UWPImaging.Image image, PhotoOrientation photoOrientation)
{
    var ras = await image.EndDraw();

    var decoder = await BitmapDecoder.CreateAsync(ras);

    var file = await KnownFolders.PicturesLibrary.CreateFileAsync(
        "test.jpeg",
        CreationCollisionOption.GenerateUniqueName);

    using (var outputStream = await file.OpenAsync(FileAccessMode.ReadWrite))
    {
        var encoder = await BitmapEncoder.CreateForTranscodingAsync(outputStream, decoder);

        var properties = new BitmapPropertySet { { "System.Photo.Orientation", new BitmapTypedValue(photoOrientation, PropertyType.UInt16) } };

        await encoder.BitmapProperties.SetPropertiesAsync(properties); // This is where the error occurs

        await encoder.FlushAsync();
    }
}

非常感谢任何有关如何获取这些标题的帮助!

谢谢,

诺兰

0 个答案:

没有答案