我正在尝试在我的 UWP 应用程序中调整图像大小。大多数情况下,附加代码有效,但有时会await encoder.FlushAsync();
抛出ArgumentException
.
我已经前往 MSDN(https://msdn.microsoft.com/en-us/library/windows/apps/windows.graphics.imaging.bitmapencoder.bitmaptransform.aspx),他们告诉我(在“备注”) :
如果您尝试使用 BitmapTransform 成员缩放以索引像素格式存储的图像,FlushAsync 将失败并显示 HRESULT WINCODEC_ERR_INVALIDPARAMETER 。相反,您必须使用 GetPixelDataAsync 获取缩放后的像素数据,然后使用 SetPixelData 在编码器上进行设置。
我已经尝试过这样做,请参阅两条注释行(由于重复,这对我来说看起来有些错误)。在第二行(我尝试这样做),编码器以异常SetPixelData
奖励我。buffer allocated not sufficient
var decoder = await BitmapDecoder.CreateAsync(streamToReadFrom.AsStream().AsRandomAccessStream());
if (decoder.OrientedPixelHeight > height ||
decoder.OrientedPixelWidth > width)
{
var resizedStream = new InMemoryRandomAccessStream();
BitmapEncoder encoder = await BitmapEncoder.CreateForTranscodingAsync(resizedStream, decoder);
encoder.BitmapTransform.InterpolationMode = BitmapInterpolationMode.Fant;
encoder.BitmapTransform.ScaledHeight = newHeight;
encoder.BitmapTransform.ScaledWidth = newWidth;
//"buffer allocated not sufficient"
// var pd = await decoder.GetPixelDataAsync(BitmapPixelFormat.Rgba16, BitmapAlphaMode.Ignore,
// encoder.BitmapTransform, ExifOrientationMode.IgnoreExifOrientation, ColorManagementMode.DoNotColorManage);
// encoder.SetPixelData(BitmapPixelFormat.Rgba16, BitmapAlphaMode.Ignore,
// decoder.OrientedPixelWidth, decoder.OrientedPixelHeight, decoder.DpiX, decoder.DpiY, pd.DetachPixelData());
// write out to the stream
// might fail cause https://msdn.microsoft.com/en-us/library/windows/apps/windows.graphics.imaging.bitmapencoder.bitmaptransform.aspx
await encoder.FlushAsync();
// Read out resizedStream and return
}
导致此问题的示例图像:http ://www.spiegel.de/images/image-1028227-hppano-lqbn.jpg 。此处的单元测试:https ://github.com/famoser/OfflineMedia/blob/master/Famoser.OfflineMedia.UnitTests/Presentation/ImageResizeTest.cs
我怎样才能避免ArgumentException
?我怎么知道图像是“索引像素格式”,以及如何调整这种格式的大小?