Windows Phone 8.1 媒体捕获旋转不正确
Windows Phone 8.1 Media Capture Rotated Incorrectly
我很难正确旋转捕获的图像,位图编码器 class 似乎没有做任何事情。
private async Task CapturePhoto()
{
ImageEncodingProperties pIEPEncoder = ImageEncodingProperties.CreateJpeg();
InMemoryRandomAccessStream pIMSCapture = new InMemoryRandomAccessStream();
using (pIMSCapture)
{
await cMCeCapture.CapturePhotoToStreamAsync(pIEPEncoder, pIMSCapture);
pIMSCapture.Seek(0);
BitmapDecoder pBDrDecoder = await BitmapDecoder.CreateAsync(pIMSCapture);
BitmapEncoder pBErEncoder = await BitmapEncoder.CreateForTranscodingAsync(pIMSCapture, pBDrDecoder);
pBErEncoder.BitmapTransform.InterpolationMode = BitmapInterpolationMode.Fant;
pBErEncoder.BitmapTransform.Rotation = ConvertDegreesToBitmapRotation(cIntRotationDegrees);
await pBErEncoder.FlushAsync();
BitmapImage pBIeCapture = new BitmapImage();
pIMSCapture.Seek(0);
await pBIeCapture.SetSourceAsync(pIMSCapture);
CaptureImage.Source = pBIeCapture;
CaptureImage.Stretch = Stretch.Uniform;
CaptureImage.Width = LayoutRoot.ActualWidth;
CaptureImage.Height = LayoutRoot.ActualHeight;
}
await CleanupCameraAsync();
}
有什么解决办法吗?相机 API 最近似乎是我的克星,让任何东西按我想要的方式工作真是令人沮丧。
我找到了另一种解决方案,那就是使用从这里获得的 WritableBitmapEx class,
https://writeablebitmapex.codeplex.com/
这实际上做了它应该做的事情,与 BitmapEncoder class 出于某种原因不同。此外,它非常易于使用。虽然翻转水平似乎翻转垂直,但不完全确定为什么,但它仍然有效。我刚换了水平和垂直。
private async Task CapturePhoto()
{
ImageEncodingProperties pIEPEncoder = ImageEncodingProperties.CreateJpeg();
InMemoryRandomAccessStream pIMSCapture = new InMemoryRandomAccessStream();
using (pIMSCapture)
{
await cMCeCapture.CapturePhotoToStreamAsync(pIEPEncoder, pIMSCapture);
if(!cBlnExternalCamera)
{
pIMSCapture.Seek(0);
BitmapImage pBIeCapture = new BitmapImage();
await pBIeCapture.SetSourceAsync(pIMSCapture);
pIMSCapture.Seek(0);
WriteableBitmap pWBpBitmap = new WriteableBitmap(pBIeCapture.PixelWidth, pBIeCapture.PixelHeight);
await pWBpBitmap.SetSourceAsync(pIMSCapture);
if (cIntRotationDegrees != 0)
pWBpBitmap = pWBpBitmap.Rotate(cIntRotationDegrees);
if (cBlnMirroringPreview)
pWBpBitmap = pWBpBitmap.Flip(cDInDisplayInformation.CurrentOrientation == DisplayOrientations.Landscape || cDInDisplayInformation.CurrentOrientation == DisplayOrientations.LandscapeFlipped ? WriteableBitmapExtensions.FlipMode.Vertical : WriteableBitmapExtensions.FlipMode.Horizontal);
CaptureImage.Source = pWBpBitmap;
CaptureImage.Stretch = Stretch.Uniform;
CaptureImage.Width = LayoutRoot.ActualWidth;
CaptureImage.Height = LayoutRoot.ActualHeight;
}
else
{
pIMSCapture.Seek(0);
BitmapImage pBIeCapture = new BitmapImage();
await pBIeCapture.SetSourceAsync(pIMSCapture);
CaptureImage.Source = pBIeCapture;
CaptureImage.Stretch = Stretch.Uniform;
CaptureImage.Width = LayoutRoot.ActualWidth;
CaptureImage.Height = LayoutRoot.ActualHeight;
}
}
await CleanupCameraAsync();
}
我很难正确旋转捕获的图像,位图编码器 class 似乎没有做任何事情。
private async Task CapturePhoto()
{
ImageEncodingProperties pIEPEncoder = ImageEncodingProperties.CreateJpeg();
InMemoryRandomAccessStream pIMSCapture = new InMemoryRandomAccessStream();
using (pIMSCapture)
{
await cMCeCapture.CapturePhotoToStreamAsync(pIEPEncoder, pIMSCapture);
pIMSCapture.Seek(0);
BitmapDecoder pBDrDecoder = await BitmapDecoder.CreateAsync(pIMSCapture);
BitmapEncoder pBErEncoder = await BitmapEncoder.CreateForTranscodingAsync(pIMSCapture, pBDrDecoder);
pBErEncoder.BitmapTransform.InterpolationMode = BitmapInterpolationMode.Fant;
pBErEncoder.BitmapTransform.Rotation = ConvertDegreesToBitmapRotation(cIntRotationDegrees);
await pBErEncoder.FlushAsync();
BitmapImage pBIeCapture = new BitmapImage();
pIMSCapture.Seek(0);
await pBIeCapture.SetSourceAsync(pIMSCapture);
CaptureImage.Source = pBIeCapture;
CaptureImage.Stretch = Stretch.Uniform;
CaptureImage.Width = LayoutRoot.ActualWidth;
CaptureImage.Height = LayoutRoot.ActualHeight;
}
await CleanupCameraAsync();
}
有什么解决办法吗?相机 API 最近似乎是我的克星,让任何东西按我想要的方式工作真是令人沮丧。
我找到了另一种解决方案,那就是使用从这里获得的 WritableBitmapEx class,
https://writeablebitmapex.codeplex.com/
这实际上做了它应该做的事情,与 BitmapEncoder class 出于某种原因不同。此外,它非常易于使用。虽然翻转水平似乎翻转垂直,但不完全确定为什么,但它仍然有效。我刚换了水平和垂直。
private async Task CapturePhoto()
{
ImageEncodingProperties pIEPEncoder = ImageEncodingProperties.CreateJpeg();
InMemoryRandomAccessStream pIMSCapture = new InMemoryRandomAccessStream();
using (pIMSCapture)
{
await cMCeCapture.CapturePhotoToStreamAsync(pIEPEncoder, pIMSCapture);
if(!cBlnExternalCamera)
{
pIMSCapture.Seek(0);
BitmapImage pBIeCapture = new BitmapImage();
await pBIeCapture.SetSourceAsync(pIMSCapture);
pIMSCapture.Seek(0);
WriteableBitmap pWBpBitmap = new WriteableBitmap(pBIeCapture.PixelWidth, pBIeCapture.PixelHeight);
await pWBpBitmap.SetSourceAsync(pIMSCapture);
if (cIntRotationDegrees != 0)
pWBpBitmap = pWBpBitmap.Rotate(cIntRotationDegrees);
if (cBlnMirroringPreview)
pWBpBitmap = pWBpBitmap.Flip(cDInDisplayInformation.CurrentOrientation == DisplayOrientations.Landscape || cDInDisplayInformation.CurrentOrientation == DisplayOrientations.LandscapeFlipped ? WriteableBitmapExtensions.FlipMode.Vertical : WriteableBitmapExtensions.FlipMode.Horizontal);
CaptureImage.Source = pWBpBitmap;
CaptureImage.Stretch = Stretch.Uniform;
CaptureImage.Width = LayoutRoot.ActualWidth;
CaptureImage.Height = LayoutRoot.ActualHeight;
}
else
{
pIMSCapture.Seek(0);
BitmapImage pBIeCapture = new BitmapImage();
await pBIeCapture.SetSourceAsync(pIMSCapture);
CaptureImage.Source = pBIeCapture;
CaptureImage.Stretch = Stretch.Uniform;
CaptureImage.Width = LayoutRoot.ActualWidth;
CaptureImage.Height = LayoutRoot.ActualHeight;
}
}
await CleanupCameraAsync();
}