AspectFill 不适用于 xamarin 中的 SkiaSharp 中调整大小的图像,我该怎么办?

问题描述

我已经在模拟器上尝试过 AspectFill 并且它可以工作,只有来自相机模拟器的图片而且它们是低分辨率的,所以它们没有被调整大小。但是,当我在移动设备中尝试这样做时,我的高分辨率图片已由 SkiaSharp 调整大小并保存为缩略图不起作用,我将发送一些代码和应用程​​序的屏幕截图。

image

image

调整代码大小:

var bitmap = SKBitmap.Decode(Path);
        int h = bitmap.Height;
        int w = bitmap.Width;
        int newWidth = w;
        int newHeight = h;            
        
        if (h > 1080 || w > 1080)
        {
            int rectHeight = 1080;
            int rectWidth = 1080;

            //aspect ratio calculation   
            float W = w;
            float H = h;
            float aspect = W / H;                               

            //new dimensions by aspect ratio
            newWidth = (int)(rectWidth * aspect);
            newHeight = (int)(newWidth / aspect);                

            //if one of the two dimensions exceed the Box dimensions
            if (newWidth > rectWidth || newHeight > rectHeight)
            {
                //depending on which of the two exceeds the Box dimensions set it as the Box dimension and calculate the other one based on the aspect ratio
                if (newWidth > newHeight)
                {
                    newWidth = rectWidth;
                    newHeight = (int)(newWidth / aspect);                        
                }
                else
                {
                    newHeight = rectHeight;
                    newWidth = (int)(newHeight * aspect);                        
                }
            }                              
        }
                
            
        var resizedImage = bitmap.Resize(new SKImageInfo(newWidth,newHeight),SKBitmapResizeMethod.lanczos3);
        var image = resizedImage.Encode(SKEncodedImageFormat.Jpeg,80);
        var path = System.Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData);            
        var filepath = System.IO.Path.Combine(path,fileName);
        string finalPath = filepath;
        using (var stream = File.OpenWrite(filepath))            
            image.Saveto(stream);            
        return finalPath;

集合视图:

<DataTemplate>
                    <StackLayout Margin="0">
                        <Frame Padding="0" BackgroundColor="{AppThemeBinding Light='#00d2ff',Dark='#121212'}" Margin="0,70,0" CornerRadius="30">
                            <StackLayout Padding="20">
                                <Label Text="{Binding Airline}" TextColor ="White" FontAttributes="Bold" FontSize="35" FontFamily="Lato" Margin="0" HorizontalOptions="Center" HorizontalTextAlignment="Center"/>
                                <Grid HorizontalOptions="CenterandExpand" VerticalOptions="CenterandExpand">
                                    <Image Source="{Binding ThumbnailUrl}" Aspect="AspectFill"/>
                                </Grid>
                                <Label Text="{Binding Plane,StringFormat='Plane: {0}'}" FontFamily="Lato" TextColor ="White" FontSize="15"/>
                                <Label Text="{Binding Airline,StringFormat='Airline: {0}'}" FontFamily="Lato" TextColor ="White" FontSize="15"/>
                                <Label Text="{Binding Livery,StringFormat='Livery: {0}'}" FontFamily="Lato" TextColor ="White" FontSize="15"/>
                                <Label Text="{Binding Registration,StringFormat='Reg: {0}'}" FontFamily="Lato" TextColor ="White" FontSize="15"/>
                                <Label Text="{Binding Airport,StringFormat='Airport: {0}'}" FontFamily="Lato" TextColor ="White" FontSize="15"/>
                                <Grid>
                                    <Grid.ColumnDeFinitions>
                                        <ColumnDeFinition Width="*"/>
                                        <ColumnDeFinition Width="*" />
                                    </Grid.ColumnDeFinitions>
                                    <StackLayout Grid.Column="0">
                                        <Label Text="{Binding Date,StringFormat='Date: {0}'}" FontFamily="Lato" TextColor ="White" FontSize="15"/>
                                        <Label Text="{Binding Comment,StringFormat='Comment: {0}'}" FontFamily="Lato" TextColor ="White" FontSize="15"/>
                                    </StackLayout>
                                    <AbsoluteLayout Grid.Column="1">
                                        <Button Text="Delete" TextColor="White" CornerRadius="30" FontAttributes="Bold" FontSize="14" FontFamily="Lato" BackgroundColor="#00aeef" x:Name="deleteButton" Clicked="deleteButton_Clicked" AbsoluteLayout.LayoutBounds="0.8,0.5,100,50" AbsoluteLayout.LayoutFlags="PositionProportional"/>
                                    </AbsoluteLayout>
                                </Grid>
                            </StackLayout>
                        </Frame>
                    </StackLayout>
                </DataTemplate>

解决方法

我已经用 FFImageLoading 做到了:

<Grid HorizontalOptions="FillAndExpand" VerticalOptions="FillAndExpand">
                                    <ff:CachedImage Source="{Binding ThumbnailUrl}"
                                                    HorizontalOptions="FillAndExpand"
                                                    VerticalOptions="FillAndExpand"
                                                    
                                                    Aspect="AspectFill"
                                                    DownsampleToViewSize="True"/>
                                </Grid>