画像

[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などのライブラリを検討することもあります。

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");
        }
    }
}

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

まとめ

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

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

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

関連記事

Back to top button