Я пытаюсь изменить размер изображений в своем приложении 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
Exception.
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
? Как узнать, что изображение находится в «формате индексированных пикселей», и как я могу изменить размер этого формата?