C# UWP:如何降低选定图像的质量?
我的代码允许用户使用文件选择器选择图像&我将图像转换为字节数组,以便可以序列化。在查看图像集合时,如果我的图像太多,应用程序将崩溃并无法加载。当我使用visualstudio进行调试时,它运行得很好,但加载图像需要很长时间。我相信它超时了,因为加载需要很长时间。获取存储文件后。我如何降低BitmapImage的质量,以便在序列化时不必花那么长的时间加载C# UWP:如何降低选定图像的质量?,c#,image,uwp,image-quality,C#,Image,Uwp,Image Quality,我的代码允许用户使用文件选择器选择图像&我将图像转换为字节数组,以便可以序列化。在查看图像集合时,如果我的图像太多,应用程序将崩溃并无法加载。当我使用visualstudio进行调试时,它运行得很好,但加载图像需要很长时间。我相信它超时了,因为加载需要很长时间。获取存储文件后。我如何降低BitmapImage的质量,以便在序列化时不必花那么长的时间加载 private async void AddPic_OnClick(object sender, RoutedEventArgs e)
private async void AddPic_OnClick(object sender, RoutedEventArgs e)
{
ImagePath = string.Empty;
FileOpenPicker openPicker = new FileOpenPicker();
openPicker.ViewMode = PickerViewMode.Thumbnail;
openPicker.SuggestedStartLocation = PickerLocationId.PicturesLibrary;
openPicker.FileTypeFilter.Clear();
openPicker.FileTypeFilter.Add(".bmp");
openPicker.FileTypeFilter.Add(".jpg");
openPicker.FileTypeFilter.Add(".jpeg");
openPicker.FileTypeFilter.Add(".png");
// Launch file open picker and caller app is suspended and may be terminated
var file = await openPicker.PickSingleFileAsync();
if (file != null)
{
var stream = await file.OpenAsync(Windows.Storage.FileAccessMode.Read);
var image = new BitmapImage();
image.SetSource(stream);
xamlimg.Source = image;
_myClass.ImageBytes = await App.DataModel.GetBytesAsync(file);
}
}
其他课程详情:
public BitmapImage Image
{
get
{
if (ImageBytes == null)
return null;
if (_Image == null)
_Image = new BitmapImage();
using (var stream = new InMemoryRandomAccessStream())
{
stream.WriteAsync(ImageBytes.AsBuffer()).Completed = (i, j) =>
{
stream.Seek(0);
_Image.SetSource(stream);
};
}
return _Image;
}
}
[JsonProperty]
public byte[] ImageBytes { get; set; }
public async Task<byte[]> GetBytesAsync(StorageFile file)
{
byte[] fileBytes = null;
if (file == null) return null;
using (var stream = await file.OpenReadAsync())
{
fileBytes = new byte[stream.Size];
using (var reader = new DataReader(stream))
{
await reader.LoadAsync((uint) stream.Size);
reader.ReadBytes(fileBytes);
}
}
return fileBytes;
}
公共位图图像
{
收到
{
如果(ImageBytes==null)
返回null;
如果(_Image==null)
_Image=新的位图图像();
使用(var stream=new InMemoryRandomAccessStream())
{
stream.WriteAsync(ImageBytes.AsBuffer()).Completed=(i,j)=>
{
stream.Seek(0);
_Image.SetSource(流);
};
}
返回图像;
}
}
[JsonProperty]
公共字节[]图像字节{get;set;}
公共异步任务GetByteAsync(存储文件)
{
byte[]fileBytes=null;
如果(file==null)返回null;
使用(var stream=await file.OpenReadAsync())
{
fileBytes=新字节[stream.Size];
使用(变量读取器=新数据读取器(流))
{
wait reader.LoadAsync((uint)stream.Size);
reader.ReadBytes(fileBytes);
}
}
返回文件字节;
}
您可以对其进行解码并将其缩小。因此,一旦从文件选择器获得结果,您可以执行以下操作:
using (IRandomAccessStream fileStream = await result.OpenAsync(FileAccessMode.Read))
{
BitmapDecoder decoder = await BitmapDecoder.CreateAsync(fileStream);
using (var encoderStream = new InMemoryRandomAccessStream())
{
BitmapEncoder encoder = await BitmapEncoder.CreateForTranscodingAsync(encoderStream, decoder);
var newHeight = decoder.PixelHeight / 2;
var newWidth = decoder.PixelWidth / 2;
encoder.BitmapTransform.ScaledHeight = newHeight;
encoder.BitmapTransform.ScaledWidth = newWidth;
await encoder.FlushAsync();
byte[] pixels = new byte[newWidth * newHeight * 4];
await encoderStream.ReadAsync(pixels.AsBuffer(), (uint)pixels.Length, InputStreamOptions.None);
}
然后,字节数组像素应该更小以进行序列化,但图像质量会更差。您可以对其进行解码并将其缩放到更小。因此,一旦从文件选择器获得结果,您可以执行以下操作:
using (IRandomAccessStream fileStream = await result.OpenAsync(FileAccessMode.Read))
{
BitmapDecoder decoder = await BitmapDecoder.CreateAsync(fileStream);
using (var encoderStream = new InMemoryRandomAccessStream())
{
BitmapEncoder encoder = await BitmapEncoder.CreateForTranscodingAsync(encoderStream, decoder);
var newHeight = decoder.PixelHeight / 2;
var newWidth = decoder.PixelWidth / 2;
encoder.BitmapTransform.ScaledHeight = newHeight;
encoder.BitmapTransform.ScaledWidth = newWidth;
await encoder.FlushAsync();
byte[] pixels = new byte[newWidth * newHeight * 4];
await encoderStream.ReadAsync(pixels.AsBuffer(), (uint)pixels.Length, InputStreamOptions.None);
}
字节数组像素应该更小,以便序列化,但图像质量会更差。您有哪些图像?它们的分辨率是否可以降低到特定的最小尺寸,或者您是否只想降低JPEG的质量?您有哪些图像?它们的分辨率是否可以降低到特定的最小尺寸,或者您只想降低JPEG的质量?为什么在这一行乘以4:
byte[]像素=新字节[newWidth*newHeight*4]代码>?@bunkerdive,因为每个像素都是RGBA,每个像素都由一个字节表示。为什么在这一行乘以4:byte[]像素=新字节[newWidth*newHeight*4]因为每个像素都是RGBA,并且每个像素都由一个字节表示。