第十三章:位图(一)

简介:

图形用户界面的可视元素可以粗略地分为用于呈现的元素(例如文本)和能够与用户交互的元素,例如按钮,滑块和列表框。
文本对于呈现至关重要,但图片通常与补充文本和传达重要信息的方式同样重要。例如,没有图片,网络是不可想象的。这些图像通常是称为位图的图像元素(或像素)的矩形阵列的形式。
就像名为Label的视图显示文本一样,名为Image的视图显示位图。 iOS,Android和Windows运行时支持的?的位图有点不同,但如果您在Xamarin.Forms应用程序中坚持使用JPEG,PNG,GIF和BMP,则可能不会遇到任何问题。
Image定义了一个Source属性,您可以将其设置为ImageSource类型的对象,该对象引用Image显示的位图。位图可以来自各种源,因此ImageSource类定义了四个返回ImageSource对象的静态创建方法:

  • ImageSource.FromUri用于通过Web访问位图。
  • ImageSource.FromResource,用于存储为应用程序PCL中的嵌入式资源的位图。
  • ImageSource.FromFile用于存储为单个平台项目中的内容的位图。
  • ImageSource.FromStream,用于通过使用.NET Stream对象加载位图。

ImageSource还有三个后代类,名为UriImageSource,FileImageSource和StreamImageSource,您可以使用它们代替第一,第三和第四个静态创建方法。 通常,静态方法在代码中更容易使用,但XAML中有时需要后代类。
通常,您将使用ImageSource.FromUri和ImageSource.FromResource方法获取用于演示目的的独立于平台的位图,并使用ImageSource.FromFile为用户界面对象加载特定于平台的位图。 小位图在MenuItem和ToolbarItem对象中起着至关重要的作用,您还可以向Button添加位图。
本章首先使用从Image?Source.FromUri和ImageSource.FromResource方法获得的与平台无关的位图。 然后讨论了ImageSource.FromStream方法的一些用法。 本章最后使用ImageSource.FromFile获取工具栏和按钮的特定于平台的位图。

与平台无关的位图

这是一个名为WebBitmapCode的仅代码程序,其页面类使用ImageSource.FromUri从Xamarin网站访问位图:

public class WebBitmapCodePage : ContentPage
{
    public WebBitmapCodePage()
    {
        string uri = "https://developer.xamarin.com/demo/IMG_1415.JPG";
        Content = new Image
        {
            Source = ImageSource.FromUri(new Uri(uri))
        };
    }
}

如果传递给ImageSource.FromUri的URI未指向有效位图,则不会引发异常。
即便是这个小程序也可以简化。 ImageSource定义了从字符串或Uri到ImageSource对象的隐式转换,因此您可以将带有URI的字符串直接设置为Image的源支持:

public class WebBitmapCodePage : ContentPage
{
    public WebBitmapCodePage()
    {
        Content = new Image
        {
            Source = "https://developer.xamarin.com/demo/IMG_1415.JPG"
        };
    }
}

或者,为了使其更加详细,可以将Image的Source属性设置为UriImageSource对象,并将其Uri属性设置为Uri对象:

public class WebBitmapCodePage : ContentPage
{
    public WebBitmapCodePage()
    {
        Content = new Image
        {
            Source = new UriImageSource
            {
                Uri = new Uri("https://developer.xamarin.com/demo/IMG_1415.JPG")
            }
        };
    }
}

如果要控制基于Web的图像的缓存,则可能首选UriImageSource类。 该类实现了自己的缓存,该缓存使用每个平台上可用的应用程序的私有存储区域。 UriImageSource定义了一个CachingEnabled属性,其默认值为true,TimeSpan类型的CachingValidity属性的默认值为一天。 这意味着如果在一天内重新访问图像,则使用缓存的图像。 您可以通过将CachingEnabled设置为false来完全禁用缓存,也可以通过将CachingValidity属性设置为另一个TimeSpan值来更改缓存到期时间。
无论您采用哪种方式,默认情况下,Image视图显示的位图会拉伸到其容器的大小 - 在这种情况下为ContentPage - 同时遵循位图的宽高比:
201808132144050372
此位图是方形的,因此图像上方和下方会出现空白区域。 当您在纵向和横向模式之间转动手机或模拟器时,渲染的位图可以更改大小,您将在顶部和底部或左侧和右侧看到一些空白区域,位图无法到达。 您可以使用Image继承自VisualElement的BackgroundColor属性为该区域着色。
WebBitmapCode程序中引用的位图是4,096像素的正方形,但Xamarin网站上安装了一个实用程序,它允许您通过指定URI来下载更小的位图文件,如下所示:

Content = new Image
{
    Source = "https://developer.xamarin.com/demo/IMG_1415.JPG?width=25"
};

现在下载的位图是25像素的正方形,但它再次拉伸到其容器的大小。 每个平台都实现了一种插值算法,试图在图像展开以适合页面时平滑像素:
201808132145180373
但是,如果现在将Image上的HorizontalOptions和VerticalOptions设置为Center
或者将Image元素放在StackLayout中 - 这个25像素的位图会折叠成一个非常小的图像。 本章稍后将更详细地讨论这种现象。
您还可以在XAML中实例化Image元素,并通过将Source属性直接设置为Web地址来从URL加载位图。 这是WebBitmapXaml程序中的XAML文件:

<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="WebBitmapXaml.WebBitmapXamlPage">
    <Image Source="https://developer.xamarin.com/demo/IMG_3256.JPG" />
 
</ContentPage>

更详细的方法涉及显式实例化UriImageSource对象并设置Uri属性:

<Image>
    <Image.Source>
        <UriImageSource Uri="https://developer.xamarin.com/demo/IMG_3256.JPG" />
    </Image.Source>
</Image>

无论如何,这是它在屏幕上的样子:
201808132148040374

目录
相关文章
|
Java
如何用Java实现位图转矢量图?
通过前面几篇图片转字符、灰度图的文章介绍之后,接下来我们再来看一个有意思的东西,基于前文的基础,实现位图转矢量图的功能
1365 0
如何用Java实现位图转矢量图?
|
6月前
|
存储 算法 C++
【C++入门到精通】位图 | 位图的实现[ C++入门 ]
【C++入门到精通】位图 | 位图的实现[ C++入门 ]
72 0
|
6月前
|
XML 算法 Java
Android App开发之位图加工Bitmap中转换位图的像素色彩、裁剪内部区域、利用矩阵变换位图的讲解及实战(附源码和演示)
Android App开发之位图加工Bitmap中转换位图的像素色彩、裁剪内部区域、利用矩阵变换位图的讲解及实战(附源码和演示)
98 0
|
算法 NoSQL C#
C#位图BitArray 小试牛刀
难缠的布隆过滤器,这次终于通透了
C#位图BitArray 小试牛刀
Halcon把8位图转换为24位图的方法
Halcon把8位图转换为24位图的方法
470 0
|
Android开发 Windows iOS开发
|
JavaScript Android开发 iOS开发
|
存储 编解码 Android开发
|
JavaScript Android开发 索引
|
存储 JavaScript Android开发