此信息与预发布产品相关,相应产品在商业发布之前可能会进行重大修改。 Microsoft 对此处提供的信息不提供任何明示或暗示的保证。

对于当前版本,请参阅 本文的 .NET 7 版本

本文介绍在 Blazor 应用中处理图像的常见情况。

在本文中,术语 客户端 / 客户端侧 服务器 / 服务器侧 用于区分应用代码执行的位置:

  • 客户端 / 客户端侧
  • Blazor Web 应用的客户端呈现 (CSR) 和交互性。 Program 文件是客户端项目( BlazorWeb-CSharp.Client )的 Program.cs 。 Blazor 脚本启动配置位于服务器项目( BlazorWeb-CSharp )的 App 组件( Components/App.razor )中。
  • Blazor WebAssembly 应用。 文件 Program Program.cs . Blazor 脚本启动配置位于 wwwroot/index.html 文件中。
  • 服务器 / 服务器侧 :Blazor Web 应用的服务器侧呈现 (SSR) 和交互性。 Program 文件是服务器项目 ( BlazorWeb-CSharp ) 的 Program.cs 。 Blazor 脚本启动配置位于 App 组件 ( Components/App.razor ) 中。
  • 带有 @page 指令的可路由组件放置在 Components/Pages 文件夹中。 不可路由的共享组件放置在 Components 文件夹中。

  • 客户端 / 客户端侧
  • 托管的 Blazor WebAssembly 应用的 Client 项目。
  • Blazor WebAssembly 应用。
  • Blazor 脚本启动配置位于 wwwroot/index.html 文件中。
  • Program 文件为 Program.cs
  • 服务器 / 服务器端
  • 托管的 Blazor WebAssembly 应用的 Server 项目。
  • Blazor Server 应用。 Blazor 脚本启动配置位于 Pages/_Host.cshtml 中。
  • Program 文件为 Program.cs
  • 托管的 Blazor WebAssembly 应用的 Client 项目。
  • Blazor WebAssembly 应用。
  • Blazor 脚本启动配置位于 wwwroot/index.html 文件中。
  • Program 文件为 Program.cs
  • 服务器 / 服务器端
  • 托管的 Blazor WebAssembly 应用的 Server 项目。
  • Blazor Server 应用。 Blazor 脚本启动配置位于 Pages/_Layout.cshtml 中。
  • Program 文件为 Program.cs
  • 将图像放置在应用的 Web 根目录 ( wwwroot ) 中名为 images 的新文件夹中。 images 文件夹的使用仅用于演示目的。 可以在喜欢的任何文件夹布局中组织图像,包括直接从 wwwroot 文件夹中提供图像。

    在下面的 ShowImage1 组件中:

  • 图像中的源 ( src ) 动态设置为 C# 中的值 imageSource
  • ShowImage 方法基于传递到方法的图像 id 参数更新 imageSource 字段。
  • 呈现的按钮使用 images 文件夹中每个可用图像(共三个)的图像参数调用 ShowImage 方法。 文件名使用传递给该方法的参数组成,并匹配 images 文件夹中的三个图像之一。
  • ShowImage1.razor

    @page "/show-image-1"
    @attribute [RenderModeServer]
    <h1>Dynamic Image Source Example</h1>
    @if (imageSource is not null)
            <img src="@imageSource" />
    @for (var i = 1; i <= 3; i++)
        var imageId = i;
        <button @onclick="() => ShowImage(imageId)">
            Image @imageId
        </button>
    @code {
        private string? imageSource;
        private void ShowImage(int id)
            imageSource = $"images/image{id}.png";
    

    避免直接在 Lambda 表达式中使用循环变量,如前面的 for 循环示例中的 i。 否则,所有 Lambda 表达式将使用相同的变量,这将导致在所有 Lambda 中使用相同的值。 在局部变量中捕获该变量的值。 在上面的示例中:

  • 将循环变量 i 分配到 imageId
  • imageId 用于 lambda 表达式。
  • 或者,将 foreach 循环与 Enumerable.Range 结合使用,这样就能避开上述问题:

    @foreach (var imageId in Enumerable.Range(1,3))
        <button @onclick="() => ShowImage(imageId)">
            Image @imageId
        </button>
    

    有关详细信息,请参阅 ASP.NET Core Blazor 事件处理

    流式传输图像数据

    可以使用 Blazor 的流式处理互操作功能将图像直接发送到客户端,而不是在公共 URL 托管图像。

    本部分中的示例使用 JavaScript (JS) 互操作流式传输图像源数据。 以下 setImageJS 函数接受图像的 <img> 标记 id 和数据流。 该函数执行以下步骤:

  • 将提供的流读入 ArrayBuffer
  • 创建 Blob 以包装 ArrayBuffer
  • 创建一个对象 URL,用作要显示的图像的地址。
  • 通过刚创建的对象 URL 使用指定的 imageElementId 更新 <img> 元素。
  • 若要防止内存泄漏,该函数要在组件处理完图像时调用 revokeObjectURL 以释放对象 URL。
  • <script>
      window.setImage = async (imageElementId, imageStream) => {
        const arrayBuffer = await imageStream.arrayBuffer();
        const blob = new Blob([arrayBuffer]);
        const url = URL.createObjectURL(blob);
        const image = document.getElementById(imageElementId);
        image.onload = () => {
          URL.revokeObjectURL(url);
        image.src = url;
    </script>
    

    有关生产应用的 JS 位置和建议的一般指南,请参阅 ASP.NET Core Blazor JavaScript 互操作性(JS 互操作)

    以下 ShowImage2 组件:

  • System.Net.Http.HttpClientMicrosoft.JSInterop.IJSRuntime 注入服务。
  • 包含用于显示图像的标记 <img>
  • 拥有用于检索图像的 StreamGetImageStreamAsync C# 方法。 生产应用可以基于特定用户动态生成图像,或者从存储中检索图像。 以下示例检索 dotnet GitHub 存储库的 .NET 头像。
  • 拥有在用户选择按钮时触发的 SetImageAsync 方法。 SetImageAsync 执行下列步骤:
  •