[C#] 画像をBitmapクラスで読み込む方法を解説

C#で画像を読み込むには、System.Drawing名前空間のBitmapクラスを使用します。

Bitmapクラスは、画像ファイルをメモリ上に読み込み、ピクセル単位で操作できるオブジェクトを提供します。

画像を読み込むには、Bitmapクラスのコンストラクタに画像ファイルのパスを渡します。

例えば、Bitmap bitmap = new Bitmap("path_to_image");のように記述します。

これにより、指定したパスの画像がbitmapオブジェクトに読み込まれます。

この記事でわかること
  • Bitmapクラスを使った画像の読み込み方法
  • 画像のプロパティ取得の手法
  • 画像の操作や加工の具体例
  • 画像の保存方法とエンコーディング
  • エラーハンドリングの重要性と対策

目次から探す

画像をBitmapクラスで読み込む基本的な方法

C#のBitmapクラスは、画像を扱うための強力なツールです。

このセクションでは、Bitmapクラスを使用して画像を読み込む基本的な方法について解説します。

Bitmapクラスのコンストラクタを使った画像の読み込み

Bitmapクラスのコンストラクタを使用することで、簡単に画像を読み込むことができます。

以下は、Bitmapクラスを使って画像を読み込むサンプルコードです。

using System;
using System.Drawing;
class Program
{
    static void Main()
    {
        // 画像ファイルのパスを指定
        string imagePath = "path/to/your/image.jpg";
        
        // Bitmapクラスのインスタンスを作成
        Bitmap bitmap = new Bitmap(imagePath);
        
        // 画像の幅と高さを表示
        Console.WriteLine($"画像の幅: {bitmap.Width}");
        Console.WriteLine($"画像の高さ: {bitmap.Height}");
    }
}
画像の幅: 800
画像の高さ: 600

このコードでは、指定したパスの画像をBitmapクラスで読み込み、その幅と高さを表示しています。

ファイルパスを指定して画像を読み込む

ファイルパスを指定することで、特定の画像を読み込むことができます。

ファイルパスは絶対パスまたは相対パスで指定できます。

以下はその例です。

using System;
using System.Drawing;
class Program
{
    static void Main()
    {
        // 相対パスを指定
        string imagePath = "images/sample.png";
        
        // Bitmapクラスのインスタンスを作成
        Bitmap bitmap = new Bitmap(imagePath);
        
        // 画像の情報を表示
        Console.WriteLine($"画像の幅: {bitmap.Width}");
        Console.WriteLine($"画像の高さ: {bitmap.Height}");
    }
}
画像の幅: 1024
画像の高さ: 768

ストリームを使って画像を読み込む

ストリームを使用して画像を読み込むことも可能です。

これにより、メモリ上のデータから直接画像を生成できます。

以下はそのサンプルコードです。

using System;
using System.Drawing;
using System.IO;
class Program
{
    static void Main()
    {
        // 画像データをストリームとして読み込む
        using (FileStream stream = new FileStream("path/to/your/image.jpg", FileMode.Open))
        {
            // Bitmapクラスのインスタンスを作成
            Bitmap bitmap = new Bitmap(stream);
            
            // 画像の情報を表示
            Console.WriteLine($"画像の幅: {bitmap.Width}");
            Console.WriteLine($"画像の高さ: {bitmap.Height}");
        }
    }
}
画像の幅: 800
画像の高さ: 600

画像の形式に関する注意点(JPEG, PNG, BMPなど)

画像を読み込む際には、画像の形式に注意が必要です。

以下の表に、一般的な画像形式とその特徴を示します。

スクロールできます
形式特徴
JPEG高圧縮率、写真に適しているが、画質が劣化することがある
PNG可逆圧縮、透過をサポート
BMP圧縮なし、ファイルサイズが大きい

これらの形式はそれぞれ異なる特性を持っているため、用途に応じて適切な形式を選択することが重要です。

画像のプロパティを取得する

Bitmapクラスを使用すると、画像のさまざまなプロパティを簡単に取得できます。

このセクションでは、画像の幅、高さ、ピクセルフォーマット、解像度を取得する方法について解説します。

画像の幅と高さを取得する

画像の幅と高さは、BitmapクラスWidthプロパティとHeightプロパティを使用して取得できます。

以下はそのサンプルコードです。

using System;
using System.Drawing;
class Program
{
    static void Main()
    {
        // 画像ファイルのパスを指定
        string imagePath = "path/to/your/image.jpg";
        
        // Bitmapクラスのインスタンスを作成
        Bitmap bitmap = new Bitmap(imagePath);
        
        // 画像の幅と高さを取得
        int width = bitmap.Width;
        int height = bitmap.Height;
        
        // 幅と高さを表示
        Console.WriteLine($"画像の幅: {width}");
        Console.WriteLine($"画像の高さ: {height}");
    }
}
画像の幅: 800
画像の高さ: 600

このコードでは、指定した画像の幅と高さを取得し、コンソールに表示しています。

ピクセルフォーマットを確認する

画像のピクセルフォーマットは、PixelFormatプロパティを使用して確認できます。

これにより、画像がどのように色を表現しているかを知ることができます。

以下はそのサンプルコードです。

using System;
using System.Drawing;
using System.Drawing.Imaging;
class Program
{
    static void Main()
    {
        // 画像ファイルのパスを指定
        string imagePath = "path/to/your/image.png";
        
        // Bitmapクラスのインスタンスを作成
        Bitmap bitmap = new Bitmap(imagePath);
        
        // ピクセルフォーマットを取得
        PixelFormat pixelFormat = bitmap.PixelFormat;
        
        // ピクセルフォーマットを表示
        Console.WriteLine($"画像のピクセルフォーマット: {pixelFormat}");
    }
}
画像のピクセルフォーマット: Format32bppArgb

このコードでは、指定した画像のピクセルフォーマットを取得し、表示しています。

画像の解像度を取得する

画像の解像度は、HorizontalResolutionおよびVerticalResolutionプロパティを使用して取得できます。

これにより、画像の印刷品質を知ることができます。

以下はそのサンプルコードです。

using System;
using System.Drawing;
class Program
{
    static void Main()
    {
        // 画像ファイルのパスを指定
        string imagePath = "path/to/your/image.jpg";
        
        // Bitmapクラスのインスタンスを作成
        Bitmap bitmap = new Bitmap(imagePath);
        
        // 解像度を取得
        float horizontalResolution = bitmap.HorizontalResolution;
        float verticalResolution = bitmap.VerticalResolution;
        
        // 解像度を表示
        Console.WriteLine($"水平解像度: {horizontalResolution} dpi");
        Console.WriteLine($"垂直解像度: {verticalResolution} dpi");
    }
}
水平解像度: 96 dpi
垂直解像度: 96 dpi

このコードでは、指定した画像の水平解像度と垂直解像度を取得し、表示しています。

これにより、画像の印刷時の品質を把握することができます。

画像の操作と加工

Bitmapクラスを使用すると、画像の操作や加工が簡単に行えます。

このセクションでは、画像の一部を切り取る、リサイズする、回転させる、グレースケールに変換する方法について解説します。

画像の一部を切り取る(クロップ)

画像の一部を切り取るには、Graphicsクラスを使用して新しいBitmapを作成します。

以下はそのサンプルコードです。

using System;
using System.Drawing;
class Program
{
    static void Main()
    {
        // 画像ファイルのパスを指定
        string imagePath = "path/to/your/image.jpg";
        
        // Bitmapクラスのインスタンスを作成
        Bitmap originalBitmap = new Bitmap(imagePath);
        
        // 切り取る領域を指定 (x, y, 幅, 高さ)
        Rectangle cropArea = new Rectangle(50, 50, 200, 200);
        
        // クロップした画像を作成
        Bitmap croppedBitmap = originalBitmap.Clone(cropArea, originalBitmap.PixelFormat);
        
        // クロップした画像を保存
        croppedBitmap.Save("cropped_image.jpg");
        
        Console.WriteLine("画像の一部を切り取りました。");
    }
}
画像の一部を切り取りました。

このコードでは、指定した領域を切り取り、新しい画像として保存しています。

画像をリサイズする

画像をリサイズするには、Graphicsクラスを使用して新しいサイズのBitmapを作成します。

以下はそのサンプルコードです。

using System;
using System.Drawing;
class Program
{
    static void Main()
    {
        // 画像ファイルのパスを指定
        string imagePath = "path/to/your/image.jpg";
        
        // Bitmapクラスのインスタンスを作成
        Bitmap originalBitmap = new Bitmap(imagePath);
        
        // 新しいサイズを指定
        int newWidth = 400;
        int newHeight = 300;
        
        // リサイズした画像を作成
        Bitmap resizedBitmap = new Bitmap(originalBitmap, new Size(newWidth, newHeight));
        
        // リサイズした画像を保存
        resizedBitmap.Save("resized_image.jpg");
        
        Console.WriteLine("画像をリサイズしました。");
    }
}
画像をリサイズしました。

このコードでは、指定した新しいサイズに画像をリサイズし、新しい画像として保存しています。

画像を回転させる

画像を回転させるには、RotateFlipメソッドを使用します。

以下はそのサンプルコードです。

using System;
using System.Drawing;
class Program
{
    static void Main()
    {
        // 画像ファイルのパスを指定
        string imagePath = "path/to/your/image.jpg";
        
        // Bitmapクラスのインスタンスを作成
        Bitmap bitmap = new Bitmap(imagePath);
        
        // 画像を90度回転させる
        bitmap.RotateFlip(RotateFlipType.Rotate90FlipNone);
        
        // 回転した画像を保存
        bitmap.Save("rotated_image.jpg");
        
        Console.WriteLine("画像を90度回転させました。");
    }
}
画像を90度回転させました。

このコードでは、画像を90度回転させ、新しい画像として保存しています。

画像をグレースケールに変換する

画像をグレースケールに変換するには、各ピクセルの色を変更する必要があります。

以下はそのサンプルコードです。

using System;
using System.Drawing;
class Program
{
    static void Main()
    {
        // 画像ファイルのパスを指定
        string imagePath = "path/to/your/image.jpg";
        
        // Bitmapクラスのインスタンスを作成
        Bitmap originalBitmap = new Bitmap(imagePath);
        
        // グレースケール画像を作成
        Bitmap grayBitmap = new Bitmap(originalBitmap.Width, originalBitmap.Height);
        
        for (int y = 0; y < originalBitmap.Height; y++)
        {
            for (int x = 0; x < originalBitmap.Width; x++)
            {
                // ピクセルの色を取得
                Color originalColor = originalBitmap.GetPixel(x, y);
                
                // グレースケールの値を計算
                int grayValue = (int)(originalColor.R * 0.3 + originalColor.G * 0.59 + originalColor.B * 0.11);
                
                // 新しい色を設定
                Color grayColor = Color.FromArgb(grayValue, grayValue, grayValue);
                grayBitmap.SetPixel(x, y, grayColor);
            }
        }
        
        // グレースケール画像を保存
        grayBitmap.Save("gray_image.jpg");
        
        Console.WriteLine("画像をグレースケールに変換しました。");
    }
}
画像をグレースケールに変換しました。

このコードでは、各ピクセルの色を計算してグレースケールに変換し、新しい画像として保存しています。

画像の保存

Bitmapクラスを使用して画像を操作した後、さまざまな形式で保存することができます。

このセクションでは、画像を別の形式で保存する方法、圧縮率を指定して保存する方法、保存時のエンコーディングオプションについて解説します。

画像を別の形式で保存する

画像を別の形式で保存するには、Saveメソッドを使用し、保存する形式を指定します。

以下はそのサンプルコードです。

using System;
using System.Drawing;
using System.Drawing.Imaging;
class Program
{
    static void Main()
    {
        // 画像ファイルのパスを指定
        string imagePath = "path/to/your/image.jpg";
        
        // Bitmapクラスのインスタンスを作成
        Bitmap bitmap = new Bitmap(imagePath);
        
        // PNG形式で保存
        bitmap.Save("saved_image.png", ImageFormat.Png);
        
        Console.WriteLine("画像をPNG形式で保存しました。");
    }
}
画像をPNG形式で保存しました。

このコードでは、JPEG形式の画像をPNG形式で保存しています。

画像の圧縮率を指定して保存する

JPEG形式で画像を保存する際には、圧縮率を指定することができます。

圧縮率は、EncoderParametersを使用して設定します。

以下はそのサンプルコードです。

using System;
using System.Drawing;
using System.Drawing.Imaging;
class Program
{
    static void Main()
    {
        // 画像ファイルのパスを指定
        string imagePath = "path/to/your/image.jpg";
        
        // Bitmapクラスのインスタンスを作成
        Bitmap bitmap = new Bitmap(imagePath);
        
        // JPEGエンコーダを取得
        ImageCodecInfo jpegCodec = GetEncoder(ImageFormat.Jpeg);
        
        // 圧縮率を指定
        EncoderParameters encoderParameters = new EncoderParameters(1);
        encoderParameters.Param[0] = new EncoderParameter(Encoder.Quality, 75L); // 75%の圧縮率
        
        // JPEG形式で保存
        bitmap.Save("compressed_image.jpg", jpegCodec, encoderParameters);
        
        Console.WriteLine("画像を圧縮率75%で保存しました。");
    }
    static ImageCodecInfo GetEncoder(ImageFormat format)
    {
        ImageCodecInfo[] codecs = ImageCodecInfo.GetImageDecoders();
        foreach (ImageCodecInfo codec in codecs)
        {
            if (codec.FormatID == format.Guid)
            {
                return codec;
            }
        }
        return null;
    }
}
画像を圧縮率75%で保存しました。

このコードでは、JPEG形式で画像を75%の圧縮率で保存しています。

保存時のエンコーディングオプション

画像を保存する際には、エンコーディングオプションを指定することができます。

特に、PNG形式では、圧縮レベルを指定することが可能です。

以下はそのサンプルコードです。

using System;
using System.Drawing;
using System.Drawing.Imaging;
class Program
{
    static void Main()
    {
        // 画像ファイルのパスを指定
        string imagePath = "path/to/your/image.png";
        
        // Bitmapクラスのインスタンスを作成
        Bitmap bitmap = new Bitmap(imagePath);
        
        // PNGエンコーダを取得
        ImageCodecInfo pngCodec = GetEncoder(ImageFormat.Png);
        
        // 圧縮レベルを指定
        EncoderParameters encoderParameters = new EncoderParameters(1);
        encoderParameters.Param[0] = new EncoderParameter(Encoder.Compression, 9L); // 最大圧縮
        
        // PNG形式で保存
        bitmap.Save("compressed_png_image.png", pngCodec, encoderParameters);
        
        Console.WriteLine("画像を最大圧縮で保存しました。");
    }
    static ImageCodecInfo GetEncoder(ImageFormat format)
    {
        ImageCodecInfo[] codecs = ImageCodecInfo.GetImageDecoders();
        foreach (ImageCodecInfo codec in codecs)
        {
            if (codec.FormatID == format.Guid)
            {
                return codec;
            }
        }
        return null;
    }
}
画像を最大圧縮で保存しました。

このコードでは、PNG形式で画像を最大圧縮で保存しています。

エンコーディングオプションを適切に設定することで、画像の品質やファイルサイズを調整することができます。

エラーハンドリング

画像を扱う際には、さまざまなエラーが発生する可能性があります。

このセクションでは、ファイルが存在しない場合の対処、読み込み時のフォーマットエラーの処理、メモリ不足エラーの対処法について解説します。

ファイルが存在しない場合の対処

指定したファイルが存在しない場合、FileNotFoundExceptionが発生します。

このエラーを適切に処理するためには、try-catchブロックを使用します。

以下はそのサンプルコードです。

using System;
using System.Drawing;
using System.IO;
class Program
{
    static void Main()
    {
        // 画像ファイルのパスを指定
        string imagePath = "path/to/your/nonexistent_image.jpg";
        
        try
        {
            // Bitmapクラスのインスタンスを作成
            Bitmap bitmap = new Bitmap(imagePath);
            Console.WriteLine("画像を正常に読み込みました。");
        }
        catch (FileNotFoundException ex)
        {
            Console.WriteLine($"エラー: ファイルが見つかりません。詳細: {ex.Message}");
        }
    }
}
エラー: ファイルが見つかりません。詳細: 指定されたファイルが見つかりません。

このコードでは、指定したファイルが存在しない場合にエラーメッセージを表示します。

読み込み時のフォーマットエラーの処理

画像のフォーマットが不正な場合、ArgumentExceptionが発生します。

このエラーもtry-catchブロックを使用して処理します。

以下はそのサンプルコードです。

using System;
using System.Drawing;
class Program
{
    static void Main()
    {
        // 不正なフォーマットの画像ファイルのパスを指定
        string imagePath = "path/to/your/invalid_format_image.txt";
        
        try
        {
            // Bitmapクラスのインスタンスを作成
            Bitmap bitmap = new Bitmap(imagePath);
            Console.WriteLine("画像を正常に読み込みました。");
        }
        catch (ArgumentException ex)
        {
            Console.WriteLine($"エラー: 読み込み時にフォーマットエラーが発生しました。詳細: {ex.Message}");
        }
    }
}
エラー: 読み込み時にフォーマットエラーが発生しました。詳細: 引数が無効です。

このコードでは、画像のフォーマットが不正な場合にエラーメッセージを表示します。

メモリ不足エラーの対処法

画像を読み込む際にメモリ不足が発生すると、OutOfMemoryExceptionがスローされます。

このエラーもtry-catchブロックを使用して処理します。

以下はそのサンプルコードです。

using System;
using System.Drawing;
class Program
{
    static void Main()
    {
        // 非常に大きな画像ファイルのパスを指定
        string imagePath = "path/to/your/large_image.jpg";
        
        try
        {
            // Bitmapクラスのインスタンスを作成
            Bitmap bitmap = new Bitmap(imagePath);
            Console.WriteLine("画像を正常に読み込みました。");
        }
        catch (OutOfMemoryException ex)
        {
            Console.WriteLine($"エラー: メモリ不足です。詳細: {ex.Message}");
        }
    }
}
エラー: メモリ不足です。詳細: メモリが不足しています。

このコードでは、メモリ不足が発生した場合にエラーメッセージを表示します。

メモリ不足エラーを適切に処理することで、アプリケーションの安定性を向上させることができます。

応用例

Bitmapクラスを使用した画像処理には、さまざまな応用例があります。

このセクションでは、画像のバッチ処理、サムネイルの自動生成、メタデータの読み込み、透過処理について解説します。

画像のバッチ処理

複数の画像を一度に処理するバッチ処理は、効率的な画像管理に役立ちます。

以下は、指定したフォルダ内のすべての画像をJPEG形式に変換するサンプルコードです。

using System;
using System.Drawing;
using System.IO;
class Program
{
    static void Main()
    {
        // 画像が保存されているフォルダのパスを指定
        string folderPath = "path/to/your/images";
        
        // フォルダ内のすべての画像ファイルを取得
        string[] imageFiles = Directory.GetFiles(folderPath, "*.*", SearchOption.TopDirectoryOnly);
        
        foreach (string imagePath in imageFiles)
        {
            try
            {
                // Bitmapクラスのインスタンスを作成
                Bitmap bitmap = new Bitmap(imagePath);
                
                // JPEG形式で保存
                string newFilePath = Path.ChangeExtension(imagePath, ".jpg");
                bitmap.Save(newFilePath, System.Drawing.Imaging.ImageFormat.Jpeg);
                
                Console.WriteLine($"画像を変換しました: {newFilePath}");
            }
            catch (Exception ex)
            {
                Console.WriteLine($"エラー: {ex.Message}");
            }
        }
    }
}
画像を変換しました: path/to/your/images/image1.jpg
画像を変換しました: path/to/your/images/image2.jpg
...

画像のサムネイルを自動生成する

画像のサムネイルを自動生成することで、表示速度を向上させることができます。

以下は、指定したサイズのサムネイルを生成するサンプルコードです。

using System;
using System.Drawing;
class Program
{
    static void Main()
    {
        // 画像ファイルのパスを指定
        string imagePath = "path/to/your/image.jpg";
        
        // Bitmapクラスのインスタンスを作成
        Bitmap originalBitmap = new Bitmap(imagePath);
        
        // サムネイルのサイズを指定
        int thumbnailWidth = 100;
        int thumbnailHeight = 100;
        
        // サムネイルを作成
        Bitmap thumbnailBitmap = new Bitmap(originalBitmap, new Size(thumbnailWidth, thumbnailHeight));
        
        // サムネイルを保存
        thumbnailBitmap.Save("thumbnail_image.jpg", System.Drawing.Imaging.ImageFormat.Jpeg);
        
        Console.WriteLine("サムネイルを生成しました。");
    }
}
サムネイルを生成しました。

画像のメタデータを読み込む

画像には、撮影日時やカメラの設定などのメタデータが含まれていることがあります。

以下は、画像のメタデータを読み込むサンプルコードです。

using System;
using System.Drawing;
using System.Drawing.Imaging;
class Program
{
    static void Main()
    {
        // 画像ファイルのパスを指定
        string imagePath = "path/to/your/image.jpg";
        
        // Bitmapクラスのインスタンスを作成
        Bitmap bitmap = new Bitmap(imagePath);
        
        // メタデータを取得
        PropertyItem[] propertyItems = bitmap.PropertyItems;
        
        foreach (PropertyItem propertyItem in propertyItems)
        {
            Console.WriteLine($"ID: {propertyItem.Id}, タイプ: {propertyItem.Type}, 値: {BitConverter.ToString(propertyItem.Value)}");
        }
    }
}
ID: 0x0132, タイプ: 2, 値: 20-09-2023 12:34:56
ID: 0x0112, タイプ: 3, 値: 1
...

画像の透過処理を行う

画像の特定の色を透過させることで、背景と融合させることができます。

以下は、特定の色を透過させるサンプルコードです。

using System;
using System.Drawing;
class Program
{
    static void Main()
    {
        // 画像ファイルのパスを指定
        string imagePath = "path/to/your/image.png";
        
        // Bitmapクラスのインスタンスを作成
        Bitmap bitmap = new Bitmap(imagePath);
        
        // 透過させる色を指定 (例: 白色)
        Color transparentColor = Color.White;
        
        // 透過処理を行う
        for (int y = 0; y < bitmap.Height; y++)
        {
            for (int x = 0; x < bitmap.Width; x++)
            {
                Color pixelColor = bitmap.GetPixel(x, y);
                if (pixelColor.ToArgb() == transparentColor.ToArgb())
                {
                    bitmap.SetPixel(x, y, Color.FromArgb(0, pixelColor)); // 完全に透過
                }
            }
        }
        
        // 透過処理を行った画像を保存
        bitmap.Save("transparent_image.png", System.Drawing.Imaging.ImageFormat.Png);
        
        Console.WriteLine("透過処理を行いました。");
    }
}
透過処理を行いました。

これらの応用例を通じて、Bitmapクラスを使用した画像処理の幅広い可能性を理解することができます。

よくある質問

画像の読み込みが遅い場合の対処法は?

画像の読み込みが遅い場合、以下の対処法を検討できます。

  • 画像のサイズを最適化: 大きな画像ファイルは読み込みに時間がかかります。

必要なサイズにリサイズしてから読み込むことを検討してください。

  • 非同期処理を使用: 画像の読み込みを非同期で行うことで、UIの応答性を保ちながら処理を行うことができます。
  • キャッシュを利用: 一度読み込んだ画像をキャッシュしておくことで、再度読み込む際の時間を短縮できます。

BitmapクラスでGIFアニメーションを扱うことはできる?

Bitmapクラスは静止画像を扱うためのクラスであり、GIFアニメーションを直接扱うことはできません。

ただし、GIFファイルを読み込むことは可能ですが、アニメーションのフレームを個別に処理するためには、Imageクラスを使用し、ImageAnimatorクラスを利用する必要があります。

これにより、GIFアニメーションのフレームを管理し、表示することができます。

画像の読み込み時にメモリを節約する方法は?

画像の読み込み時にメモリを節約するための方法は以下の通りです。

  • 必要なサイズで読み込む: 画像を表示するサイズにリサイズしてから読み込むことで、メモリ使用量を削減できます。
  • ストリームを使用: 画像を直接ファイルからストリームとして読み込むことで、メモリに一時的に全体を読み込む必要がなくなります。
  • Disposeメソッドを使用: 使用が終わったBitmapオブジェクトは、Disposeメソッドを呼び出してメモリを解放することが重要です。

これにより、メモリリークを防ぐことができます。

まとめ

この記事では、C#のBitmapクラスを使用して画像を読み込み、操作し、保存する方法について詳しく解説しました。

画像のプロパティを取得する方法や、さまざまな画像処理の応用例を通じて、実践的なスキルを身につけることができました。

これを機に、実際のプロジェクトで画像処理を活用し、より効果的なアプリケーションを作成してみてください。

当サイトはリンクフリーです。出典元を明記していただければ、ご自由に引用していただいて構いません。

関連カテゴリーから探す

  • 画像 (21)
  • URLをコピーしました!
目次から探す