ASP.NET Core でBitmapクラスを利用する - C#

ASP.NET Core でBitmapクラスを利用する場合の手順です。

現象の確認

ASP.NET Core Webアプリケーションのプロジェクトを作成し、Startup.cs に下記のコードを記述します。
ASP.NET Core内でBitmapオブジェクトのインスタンスを作成するコードを記述しています。
usingで従来の.NET Frameworkと同様に System.Drawing への参照を追加しています。
Startup.cs
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Drawing;

namespace SimpleBitmapInfo
{
  public class Startup
  {
    // This method gets called by the runtime. Use this method to add services to the container.
    // For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940
    public void ConfigureServices(IServiceCollection services)
    {
    }

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
      if (env.IsDevelopment()) {
        app.UseDeveloperExceptionPage();
      }

      app.UseRouting();

      app.UseEndpoints(endpoints =>
      {
        endpoints.MapGet("/", async context =>
              {
               Bitmap bmp = new Bitmap();
          });
      });
    }
  }
}

上記のコードをビルドすると下記のエラーが発生します。
アセンブリへの参照が無い旨のエラーが発生します。
エラーメッセージ
CS1069
型名 'Bitmap' は名前空間 'System.Drawing' に見つかりませんでした。この型はアセンブリ 'System.Drawing.Common, Version=0.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51' に転送されました。このアセンブリへの参照を追加することを検討してください。

原因

.NET Core では、System.Drawing 名前空間のクラスを利用する場合は、System.Drawing.Common への明示的なアセンブリの参照追加が必要なため、 と考えられます。

対処法1: NuGet を利用して System.Drawing.Common への参照を追加する

NuGetを利用して、System.Drawing.Common への参照を追加する方法です。
[ソリューション エクスプローラー]で参照を追加するプロジェクトの[依存関係]のノードをクリックして選択します。 選択状態で右クリックします。下図のポップアップメニューが表示されますので、[NuGet パッケージの管理]の項目をクリックします。


[NuGet パッケージ マネージャー]のウィンドウが表示されます。ウィンドウ上部の[参照]のタブをクリックして選択します。下図の画面が表示されます。


[NuGet パッケージ マネージャー]のウィンドウ上部の検索ボックスに "System.Drawing" を入力します。検索結果に "System.Drawing.Common" のパッケージが表示されますので、クリックして選択します。


System.Drawing.Common パッケージを選択すると右側にバージョン選択のコンボボックスと、インストールボタンが表示されます。
デフォルトでは最新の安定バージョンがインストールされる設定になっています。


[バージョン]のコンボボックスを開くと、インストールするバージョンを選択できます。通常は最新の安定板をインストールする設定で問題ないです。
右側の[インストール]ボタンをクリックします。


[変更のプレビュー]ダイアログが表示されます。[OK]ボタンをクリックしてインストールを続行します。


パッケージのインストールが完了しました。[インストール]ボタンが[アンインストール]の表示に変わっていることが確認できます。


プロジェクトをビルドします。エラーが発生せずにビルドできます。


[ソリューション エクスプローラー]のプロジェクトのノードを選択し、右クリックしポップアップメニューの[プロジェクト ファイルの編集]の項目をクリックし、 プロジェクトファイルの記述を確認します。ItemGroup タグが追加され、System.Drawing.Common のアセンブリの参照が追加されていることが確認できます。

対処法2: 直接プロジェクトファイルを変更する

[ソリューション エクスプローラー]のウィンドウを開き、参照を追加するプロジェクトのノードをクリックして選択します。 選択状態で右クリックします。下図のポップアップメニューが表示されます。メニューの[プロジェクト ファイルの編集]の項目をクリックします。


プロジェクトファイルの .csproj ファイルがエディタ画面に表示されます。


下記のコードに変更します。
ItemGroupタグを追加し
変更前の例
<Project Sdk="Microsoft.NET.Sdk.Web">

  <PropertyGroup>
    <TargetFramework>net5.0</TargetFramework>
  </PropertyGroup>

</Project>
変更後の例
<Project Sdk="Microsoft.NET.Sdk.Web">

  <PropertyGroup>
    <TargetFramework>net5.0</TargetFramework>
  </PropertyGroup>
  <ItemGroup>
    <PackageReference Include="System.Drawing.Common" Version="4.0.2.0" />
  </ItemGroup>

</Project>


プロジェクトファイルの編集後、再度プロジェクトをビルドします。エラーが発生せずにプロジェクトをビルドできました。

参考: .NET Core 3.1 の場合のプロジェクトファイル例

変更前の例
<Project Sdk="Microsoft.NET.Sdk.Web">

  <PropertyGroup>
    <TargetFramework>netcoreapp3.1</TargetFramework>
  </PropertyGroup>

</Project>
変更後の例
<Project Sdk="Microsoft.NET.Sdk.Web">

  <PropertyGroup>
    <TargetFramework>netcoreapp3.1</TargetFramework>
  </PropertyGroup>
  <ItemGroup>
    <PackageReference Include="System.Drawing.Common" Version="4.0.2.0" />
  </ItemGroup>

</Project>

参考 : NuGetを利用しない場合の System.Drawing.Common ファイルの場所

NuGetを利用しない場合、System.Drawing.Common のアセンブリのファイルがどこにあるかの紹介です。
(NuGetを利用している場合は C:\Users\(ユーザー名)\.nuget\packages\ フォルダに配置されます。)

.NET 5.0の場合は C:\Program Files\dotnet\sdk\5.0.202 フォルダに配置されます。(フォルダ名は.NETのバージョンによって多少の違いがあります。)



また、共有されるアセンブリは下記フォルダに配置されます。
  • .NET C:\Program Files\dotnet\shared\Microsoft.NETCore.App\5.0.5
  • .NET Core デスクトップアプリ C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App\5.0.5
  • ASP.NET Core C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App\5.0.5

プログラムの実装

Bitmapオブジェクトを利用したシンプルなWebアプリケーションを実装します。
Startup.cs
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Drawing;

namespace SimpleBitmapInfo
{
  public class Startup
  {
    // This method gets called by the runtime. Use this method to add services to the container.
    // For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940
    public void ConfigureServices(IServiceCollection services)
    {
    }

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
      if (env.IsDevelopment()) {
        app.UseDeveloperExceptionPage();
      }

      app.UseRouting();

      app.UseEndpoints(endpoints =>
      {
        endpoints.MapGet("/", async context =>
              {
                Bitmap bmp = new Bitmap("image.bmp");
                context.Response.ContentType = "text/plain; charset=utf-8";
                await context.Response.WriteAsync("ビットマップの幅: " + bmp.Width, System.Text.Encoding.UTF8);
              });
      });
    }
  }
}

Bitmapオブジェクトに読み込む画像は今回は下図の画像を用意します。ビットマップ形式で用意し、プロジェクトのファイルと同じ位置に配置します。


ソリューションエクスプローラのフィル配置は下図となります。

解説

アプリケーションルートにアクセスすると、テキスト(ContentType="text/plain")のレスポンスを返します。
用意したビットマップ画像の幅をメッセージで返します。

実行結果

プロジェクトを実行します。WebブラウザでWebアプリケーションのルートURLにアクセスします。下図のページが表示されます。
ビットマップ画像の幅を取得してレスポンスできている動作が確認できます。


著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用
最終更新日: 2021-05-07
作成日: 2021-05-07
iPentec all rights reserverd.