我试图写一个函数,将调整图像大小和压缩它使用压缩质量值。我发现了一些有用的信息here和here和here,但我仍然很困惑。
我正在使用依赖服务,并成功地为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, 0, Convert.ToInt32(data.Length));
return bytes;
}
catch (Exception ex)
{
return null;
}
}
我想在我的UWP项目中为依赖服务复制相同的功能,任何帮助都将不胜感激。
这是我目前所拥有的,但它不起作用。
public async Task<byte[]> DecodeImageAsync(string fileUri, int regWidth, int regHeight, 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;
}
任何想法,我可以改变代码,以调整大小以及压缩图像将不胜感激。
1条答案
按热度按时间zbq4xfa01#
最终弄明白了,我用下面的代码来实现这一点。