所以我正在创建一个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的返回流不包含任何标题信息或其他内容,因此它无法向其追加任何内容。
以下是我的代码的相关部分:
同样,您可以找到原始来源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;
}
public IRandomAccessStream EndDraw() {
return _context.EndDraw()
}
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();
}
}
非常感谢任何有关如何获取这些标题的帮助!
谢谢,