如何在Xamarin.UWP中调整大小并减小大小使用压缩质量值

问题描述

我正在尝试编写一个函数,该函数将调整图像大小并使用压缩质量值对其进行压缩。我发现了一些有用的信息hereherehere,但我仍然很困惑。

我正在使用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;
}

任何有关如何更改代码以调整大小和压缩图像的想法都将受到赞赏。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)