UWP: как изменить размер изображения
У меня есть изображение JPEG, хранящееся в байте [], которое я хочу изменить. Вот мой код:
public async Task<byte[]> ResizeImage(byte[] imageData, int reqWidth, int reqHeight, int quality)
{
var memStream = new MemoryStream(imageData);
IRandomAccessStream imageStream = memStream.AsRandomAccessStream();
var decoder = await BitmapDecoder.CreateAsync(imageStream);
if (decoder.PixelHeight > reqHeight || decoder.PixelWidth > reqWidth)
{
using (imageStream)
{
var resizedStream = new InMemoryRandomAccessStream();
BitmapEncoder encoder = await BitmapEncoder.CreateForTranscodingAsync(resizedStream, decoder);
double widthRatio = (double) reqWidth/decoder.PixelWidth;
double heightRatio = (double) reqHeight/decoder.PixelHeight;
double scaleRatio = Math.Min(widthRatio, heightRatio);
if (reqWidth == 0)
scaleRatio = heightRatio;
if (reqHeight == 0)
scaleRatio = widthRatio;
uint aspectHeight = (uint) Math.Floor(decoder.PixelHeight*scaleRatio);
uint aspectWidth = (uint) Math.Floor(decoder.PixelWidth*scaleRatio);
encoder.BitmapTransform.InterpolationMode = BitmapInterpolationMode.Linear;
encoder.BitmapTransform.ScaledHeight = aspectHeight;
encoder.BitmapTransform.ScaledWidth = aspectWidth;
await encoder.FlushAsync();
resizedStream.Seek(0);
var outBuffer = new byte[resizedStream.Size];
uint x = await resizedStream.WriteAsync(outBuffer.AsBuffer());
return outBuffer;
}
}
return imageData;
}
проблема в том, что outBuffer содержит только нули, хотя правильное количество байтов.
2 ответов
просто замените свою строку из этого
uint x = await resizedStream.WriteAsync(outBuffer.AsBuffer());
этот код:
await resizedStream.ReadAsync(outBuffer.AsBuffer(), (uint)resizedStream.Size, InputStreamOptions.None);
я наткнулся на ту же проблему на прошлой неделе и закончил с решением, которое выглядит так.
private async Task<StorageFile> RescaleImage(StorageFile sourceFile, StorageFile resizedImageFile,uint width,uint height)
{
var imageStream = await sourceFile.OpenReadAsync();
var decoder = await BitmapDecoder.CreateAsync(imageStream);
using (var resizedStream = await resizedImageFile.OpenAsync(FileAccessMode.ReadWrite))
{
var encoder = await BitmapEncoder.CreateForTranscodingAsync(resizedStream, decoder);
encoder.BitmapTransform.InterpolationMode = BitmapInterpolationMode.Linear;
encoder.BitmapTransform.ScaledWidth = width;
encoder.BitmapTransform.ScaledHeight = height;
await encoder.FlushAsync();
}
return resizedImageFile;
}