[C#] JPEG画像の読み込み方法

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

まず、System.Drawing.Commonパッケージをプロジェクトに追加します。

次に、Bitmapクラスのインスタンスを作成し、JPEGファイルのパスを指定して画像を読み込みます。

例えば、Bitmap bitmap = new Bitmap("path/to/image.jpg");のように記述します。

このbitmapオブジェクトを使用して画像の操作や表示が可能です。

ただし、System.DrawingはWindows環境に依存するため、クロスプラットフォームのプロジェクトではImageSharpなどのライブラリを検討することもあります。

この記事でわかること
  • C#でのJPEG画像の基本的な読み込み方法と操作
  • System.Drawing.Commonのインストール手順と使用方法
  • ImageSharpとSkiaSharpを用いたクロスプラットフォームでの画像処理
  • 画像のフォーマット変換やフィルタリング、メタデータの操作方法
  • 画像処理におけるライブラリの選択肢とその特徴

目次から探す

JPEG画像の読み込み方法

System.Drawingを使用した基本的な読み込み

Bitmapクラスの概要

Bitmapクラスは、画像をメモリ上に表現するためのクラスです。

このクラスを使用することで、画像の読み込み、描画、編集が可能になります。

特に、JPEG画像の読み込みにおいては、Bitmapクラスが非常に便利です。

JPEG画像の読み込み手順

JPEG画像を読み込むためには、Bitmapクラスを使用します。

以下に基本的な読み込み手順を示します。

using System;
using System.Drawing;
class Program
{
    static void Main()
    {
        // JPEG画像のファイルパスを指定
        string filePath = "sample.jpg";
        
        // Bitmapクラスを使用して画像を読み込む
        Bitmap image = new Bitmap(filePath);
        
        // 画像の幅と高さを表示
        Console.WriteLine("画像の幅: " + image.Width);
        Console.WriteLine("画像の高さ: " + image.Height);
    }
}
画像の幅: 800
画像の高さ: 600

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

読み込んだ画像の基本操作

読み込んだ画像に対して、さまざまな操作が可能です。

以下にいくつかの基本操作を示します。

  • 画像の保存: image.Save("newImage.jpg");
  • 画像の一部を切り取る: image.Clone(new Rectangle(0, 0, 100, 100), image.PixelFormat);
  • 画像の回転: image.RotateFlip(RotateFlipType.Rotate90FlipNone);

System.Drawing.Commonパッケージのインストール

NuGetパッケージマネージャーの使用方法

System.Drawing.Commonは、.NET Coreや.NET 5以降でSystem.Drawing名前空間を使用するために必要なパッケージです。

Windows Formアプリケーションとしてプロジェクトを作成していない場合は手動で追加する必要があります。

NuGetパッケージマネージャーを使用してインストールします。

  1. Visual Studioを開き、プロジェクトを選択します。
  2. メニューから「ツール」→「NuGet パッケージ マネージャー」→「ソリューションの NuGet パッケージの管理」を選択します。
  3. 参照」タブでSystem.Drawing.Commonを検索し、インストールします。

パッケージのインストール手順

コマンドラインからもインストール可能です。

以下のコマンドを使用します。

dotnet add package System.Drawing.Common

このコマンドを実行することで、プロジェクトにSystem.Drawing.Commonパッケージが追加されます。

画像の表示と操作

PictureBoxを使用した画像表示

Windowsフォームアプリケーションで画像を表示するには、PictureBoxコントロールを使用します。

以下に基本的な使用例を示します。

using System;
using System.Windows.Forms;
using System.Drawing;
class ImageForm : Form
{
    public ImageForm()
    {
        // PictureBoxを作成
        PictureBox pictureBox = new PictureBox();
        
        // 画像を読み込む
        Bitmap image = new Bitmap("sample.jpg");
        
        // PictureBoxに画像を設定
        pictureBox.Image = image;
        
        // PictureBoxのサイズを設定
        pictureBox.SizeMode = PictureBoxSizeMode.StretchImage;
        pictureBox.Dock = DockStyle.Fill;
        
        // フォームにPictureBoxを追加
        this.Controls.Add(pictureBox);
    }
    
    static void Main()
    {
        Application.Run(new ImageForm());
    }
}

このコードは、WindowsフォームアプリケーションでJPEG画像を表示します。

画像のサイズ変更と回転

画像のサイズ変更や回転は、Bitmapクラスのメソッドを使用して行います。

  • サイズ変更: image = new Bitmap(image, new Size(200, 200));
  • 回転: image.RotateFlip(RotateFlipType.Rotate180FlipNone);

画像のピクセルデータへのアクセス

画像のピクセルデータにアクセスすることで、画像の色を変更したり、フィルタを適用することができます。

using System;
using System.Drawing;
class Program
{
    static void Main()
    {
        Bitmap image = new Bitmap("sample.jpg");
        
        // 画像のピクセルデータにアクセス
        for (int y = 0; y < image.Height; y++)
        {
            for (int x = 0; x < image.Width; x++)
            {
                // ピクセルの色を取得
                Color pixelColor = image.GetPixel(x, y);
                
                // 色を反転
                Color invertedColor = Color.FromArgb(255 - pixelColor.R, 255 - pixelColor.G, 255 - pixelColor.B);
                
                // ピクセルの色を設定
                image.SetPixel(x, y, invertedColor);
            }
        }
        
        // 変更した画像を保存
        image.Save("inverted_sample.jpg");
    }
}

このコードは、画像の色を反転させ、新しいファイルとして保存します。

クロスプラットフォームでのJPEG画像の読み込み

ImageSharpライブラリの利用

ImageSharpのインストール方法

ImageSharpは、クロスプラットフォームで画像処理を行うためのライブラリです。

以下の手順でインストールします。

  1. コマンドラインで以下のコマンドを実行します。
dotnet add package SixLabors.ImageSharp

このコマンドにより、ImageSharpライブラリがプロジェクトに追加されます。

JPEG画像の読み込みと操作

ImageSharpを使用してJPEG画像を読み込む方法を示します。

using System;
using SixLabors.ImageSharp;
using SixLabors.ImageSharp.PixelFormats;
using SixLabors.ImageSharp.Processing;
class Program
{
    static void Main()
    {
        // 画像を読み込む
        using (Image<Rgba32> image = Image.Load<Rgba32>("sample.jpg"))
        {
            // 画像の幅と高さを表示
            Console.WriteLine("画像の幅: " + image.Width);
            Console.WriteLine("画像の高さ: " + image.Height);
            
            // 画像をグレースケールに変換
            image.Mutate(x => x.Grayscale());
            
            // 変更した画像を保存
            image.Save("grayscale_sample.jpg");
        }
    }
}
画像の幅: 800
画像の高さ: 600

このコードは、JPEG画像を読み込み、グレースケールに変換して保存します。

SkiaSharpライブラリの利用

SkiaSharpのインストール方法

SkiaSharpは、GoogleのSkiaグラフィックスライブラリを基にしたクロスプラットフォームの画像処理ライブラリです。

以下の手順でインストールします。

  1. コマンドラインで以下のコマンドを実行します。
dotnet add package SkiaSharp

このコマンドにより、SkiaSharpライブラリがプロジェクトに追加されます。

JPEG画像の読み込みと描画

SkiaSharpを使用してJPEG画像を読み込む方法を示します。

using System;
using System.IO;
using SkiaSharp;
class Program
{
    static void Main()
    {
        // 画像ファイルを読み込む
        using (var inputStream = File.OpenRead("sample.jpg"))
        {
            // SKBitmapを使用して画像を読み込む
            using (var bitmap = SKBitmap.Decode(inputStream))
            {
                // 画像の幅と高さを表示
                Console.WriteLine("画像の幅: " + bitmap.Width);
                Console.WriteLine("画像の高さ: " + bitmap.Height);
                
                // 画像を反転
                using (var surface = new SKCanvas(bitmap))
                {
                    surface.Scale(-1, 1, bitmap.Width / 2, 0);
                    surface.DrawBitmap(bitmap, 0, 0);
                }
                
                // 変更した画像を保存
                using (var outputStream = File.OpenWrite("flipped_sample.jpg"))
                {
                    bitmap.Encode(outputStream, SKEncodedImageFormat.Jpeg, 100);
                }
            }
        }
    }
}

このコードは、JPEG画像を読み込み、水平に反転させて保存します。

応用例

画像のフォーマット変換

JPEGからPNGへの変換

画像のフォーマットを変換することで、異なる用途に応じた画像形式を利用できます。

以下に、JPEG画像をPNG形式に変換する方法を示します。

using System;
using System.Drawing;
class Program
{
    static void Main()
    {
        // JPEG画像を読み込む
        using (Bitmap jpegImage = new Bitmap("sample.jpg"))
        {
            // PNG形式で保存
            jpegImage.Save("converted_sample.png", System.Drawing.Imaging.ImageFormat.Png);
        }
    }
}

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

画像の圧縮と品質調整

画像の圧縮と品質調整は、ファイルサイズを削減しつつ、画質を維持するために重要です。

以下に、JPEG画像の圧縮と品質調整の方法を示します。

using System;
using System.Drawing;
using System.Drawing.Imaging;
class Program
{
    static void Main()
    {
        // JPEG画像を読み込む
        using (Bitmap image = new Bitmap("sample.jpg"))
        {
            // エンコーダーのパラメータを設定
            ImageCodecInfo jpgEncoder = GetEncoder(ImageFormat.Jpeg);
            EncoderParameters encoderParams = new EncoderParameters(1);
            EncoderParameter qualityParam = new EncoderParameter(Encoder.Quality, 50L); // 品質を50に設定
            encoderParams.Param[0] = qualityParam;
            
            // 圧縮した画像を保存
            image.Save("compressed_sample.jpg", jpgEncoder, encoderParams);
        }
    }
    private static ImageCodecInfo GetEncoder(ImageFormat format)
    {
        ImageCodecInfo[] codecs = ImageCodecInfo.GetImageDecoders();
        foreach (ImageCodecInfo codec in codecs)
        {
            if (codec.FormatID == format.Guid)
            {
                return codec;
            }
        }
        return null;
    }
}

このコードは、JPEG画像を50%の品質で圧縮して保存します。

画像のフィルタリングとエフェクト

グレースケール変換

画像をグレースケールに変換することで、色の情報を削除し、明暗のみに焦点を当てた画像を作成できます。

using System;
using System.Drawing;
class Program
{
    static void Main()
    {
        // 画像を読み込む
        using (Bitmap image = new Bitmap("sample.jpg"))
        {
            // グレースケールに変換
            for (int y = 0; y < image.Height; y++)
            {
                for (int x = 0; x < image.Width; x++)
                {
                    Color originalColor = image.GetPixel(x, y);
                    int grayScale = (int)((originalColor.R * 0.3) + (originalColor.G * 0.59) + (originalColor.B * 0.11));
                    Color grayColor = Color.FromArgb(grayScale, grayScale, grayScale);
                    image.SetPixel(x, y, grayColor);
                }
            }
            
            // 変換した画像を保存
            image.Save("grayscale_sample.jpg");
        }
    }
}

このコードは、画像をグレースケールに変換して保存します。

ぼかし効果の適用

ぼかし効果を適用することで、画像の一部を柔らかくし、視覚的な焦点を変えることができます。

using System;
using System.Drawing;
using System.Drawing.Imaging;
class Program
{
    static void Main()
    {
        // 画像を読み込む
        using (Bitmap image = new Bitmap("sample.jpg"))
        {
            // ぼかしフィルタを適用
            using (Graphics graphics = Graphics.FromImage(image))
            {
                System.Drawing.Imaging.ImageAttributes attributes = new System.Drawing.Imaging.ImageAttributes();
                float[][] colorMatrixElements = {
                    new float[] {1, 0, 0, 0, 0},
                    new float[] {0, 1, 0, 0, 0},
                    new float[] {0, 0, 1, 0, 0},
                    new float[] {0, 0, 0, 0.5f, 0}, // 透明度を調整
                    new float[] {0, 0, 0, 0, 1}
                };
                ColorMatrix colorMatrix = new ColorMatrix(colorMatrixElements);
                attributes.SetColorMatrix(colorMatrix, ColorMatrixFlag.Default, ColorAdjustType.Bitmap);
                
                graphics.DrawImage(image, new Rectangle(0, 0, image.Width, image.Height), 0, 0, image.Width, image.Height, GraphicsUnit.Pixel, attributes);
            }
            
            // ぼかしを適用した画像を保存
            image.Save("blurred_sample.jpg");
        }
    }
}

このコードは、画像にぼかし効果を適用して保存します。

画像のメタデータの読み取り

EXIF情報の取得

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

以下に、EXIF情報を取得する方法を示します。

using System;
using System.Drawing;
using System.Drawing.Imaging;
class Program
{
    static void Main()
    {
        // 画像を読み込む
        using (Bitmap image = new Bitmap("sample.jpg"))
        {
            // EXIF情報を取得
            foreach (PropertyItem propItem in image.PropertyItems)
            {
                Console.WriteLine("ID: " + propItem.Id + ", Type: " + propItem.Type + ", Length: " + propItem.Len);
            }
        }
    }
}

このコードは、画像のEXIF情報をコンソールに表示します。

メタデータの編集

画像のメタデータを編集することで、画像に関する情報を追加または変更できます。

using System;
using System.Drawing;
using System.Drawing.Imaging;
class Program
{
    static void Main()
    {
        // 画像を読み込む
        using (Bitmap image = new Bitmap("sample.jpg"))
        {
            // 新しいメタデータを作成
            PropertyItem propItem = (PropertyItem)FormatterServices.GetUninitializedObject(typeof(PropertyItem));
            propItem.Id = 0x010E; // 画像の説明
            propItem.Type = 2; // ASCII文字列
            propItem.Value = System.Text.Encoding.ASCII.GetBytes("新しい説明\0");
            propItem.Len = propItem.Value.Length;
            
            // メタデータを設定
            image.SetPropertyItem(propItem);
            
            // 変更した画像を保存
            image.Save("edited_metadata_sample.jpg");
        }
    }
}

このコードは、画像のメタデータに新しい説明を追加して保存します。

よくある質問

JPEG画像を読み込む際のエラーをどう解決する?

JPEG画像を読み込む際にエラーが発生する場合、以下の点を確認してください。

  • ファイルパスの確認: ファイルパスが正しいかどうかを確認します。

相対パスではなく、絶対パスを使用することで問題を回避できる場合があります。

  • ファイルの存在: 指定したパスにファイルが存在するか確認します。

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

  • ファイル形式の確認: 読み込もうとしているファイルがJPEG形式であることを確認します。

他の形式のファイルをJPEGとして読み込もうとするとエラーが発生します。

  • ファイルの権限: ファイルにアクセスする権限があるか確認します。

権限がない場合、UnauthorizedAccessExceptionが発生します。

System.Drawingを使う際の注意点は?

System.Drawingを使用する際には、以下の点に注意してください。

  • クロスプラットフォームの制限: System.DrawingはWindows環境での使用を前提としており、LinuxやmacOSでは動作が保証されていません。

クロスプラットフォームでの使用にはSystem.Drawing.Commonをインストールする必要がありますが、完全な互換性はありません。

  • リソースの解放: BitmapGraphicsオブジェクトを使用した後は、必ずDisposeメソッドを呼び出してリソースを解放してください。

これを怠ると、メモリリークが発生する可能性があります。

  • スレッドセーフでない: System.Drawingのクラスはスレッドセーフではありません。

マルチスレッド環境で使用する場合は、適切な同期を行う必要があります。

クロスプラットフォームでの画像処理に最適なライブラリは?

クロスプラットフォームでの画像処理には、以下のライブラリが適しています。

  • ImageSharp: .NET Coreおよび.NET 5以降で動作するクロスプラットフォームの画像処理ライブラリです。

豊富な画像フォーマットのサポートと、画像の変換、フィルタリング、描画機能を提供します。

  • SkiaSharp: GoogleのSkiaグラフィックスライブラリを基にしたライブラリで、クロスプラットフォームでの高性能な画像処理が可能です。

2Dグラフィックスの描画や画像の操作に適しています。

  • Magick.NET: ImageMagickの.NETラッパーで、画像の読み込み、変換、編集を行うための強力な機能を提供します。

多くの画像フォーマットをサポートしており、クロスプラットフォームで動作します。

これらのライブラリは、それぞれ異なる特徴を持っているため、プロジェクトの要件に応じて選択してください。

まとめ

この記事では、C#を用いたJPEG画像の読み込み方法について、System.Drawingやクロスプラットフォーム対応のImageSharpSkiaSharpといったライブラリを活用する手法を詳しく解説しました。

これにより、画像のフォーマット変換やフィルタリング、メタデータの操作といった応用的な画像処理も可能であることがわかります。

これらの知識を基に、実際のプロジェクトで画像処理を試みることで、より高度なプログラミングスキルを身につけることが期待されます。

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

関連カテゴリーから探す

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