如何解决如何在Xamarin.UWP中调整大小并减小大小使用压缩质量值
我正在尝试编写一个函数,该函数将调整图像大小并使用压缩质量值对其进行压缩。我发现了一些有用的信息here和here和here,但我仍然很困惑。
我正在使用Dependency Services,并且已成功为ios和Android完成它。以下是我用于ios的代码。
iOS
public byte[] DecodeImage(byte[] imgBytes,int regWidth,int regHeight,int compressionQuality)
{
try
{
NSData data = NSData.FromArray(imgBytes);
var image = UIImage.LoadFromData(data);
data = image.AsJPEG((nfloat) compressionQuality / 100);
byte[] bytes = new byte[data.Length];
System.Runtime.InteropServices.Marshal.copy(data.Bytes,bytes,Convert.ToInt32(data.Length));
return bytes;
}
catch (Exception ex)
{
return null;
}
}
我想在我的 UWP 项目中为依赖项服务复制相同的功能,我们将不胜感激。
这是我目前拥有的,但是它不起作用。
public async Task<byte[]> DecodeImageAsync(string fileUri,int compressionQuality)
{
byte[] returnVal;
StorageFile file = await StorageFile.GetFileFromPathAsync(fileUri);
using (IRandomAccessstream stream = await file.OpenAsync(FileAccessMode.Read))
{
BitmapDecoder decoder = await BitmapDecoder.CreateAsync(stream); //ConfigureAwait(false).;
var qualityNum = (float)compressionQuality / 100;
var propertySet = new BitmapPropertySet();
var qualityValue = new BitmapTypedValue(
qualityNum,// Maximum quality
Windows.Foundation.PropertyType.Single
);
propertySet.Add("ImageQuality",qualityValue);
var resizedStream = new InMemoryRandomAccessstream();
BitmapEncoder en = await BitmapEncoder.CreateForTranscodingAsync(resizedStream,decoder);
BitmapEncoder encoder = await BitmapEncoder.CreateAsync(BitmapEncoder.JpegEncoderId,stream,propertySet);
double widthRatio = (double) regWidth / decoder.PixelWidth;
double heightRatio = (double) regHeight / decoder.PixelHeight;
double scaleRatio = Math.Min(widthRatio,heightRatio);
if (regWidth == 0)
scaleRatio = heightRatio;
if (regHeight == 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;
returnVal = new byte[stream.Size];
await encoder.FlushAsync();
stream.Seek(0);
returnVal = new byte[stream.Size];
var dr = new DataReader(stream.GetInputStreamAt(0));
await dr.LoadAsync((uint)stream.Size);
dr.ReadBytes(returnVal);
}
return returnVal;
}
任何有关如何更改代码以调整大小和压缩图像的想法都将受到赞赏。
解决方法
最终弄清楚了,我以前在下面的代码中实现了这一目标。
._resolve_user_function_type
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。