C#で画像処理を行う場合、 サムネイル生成・圧縮・リサイズ・フォーマット変換 は業務アプリでもよく使われます。 この記事では、ImageSharp / SkiaSharp / System.Drawing の3つを比較しつつ、 実務で使えるコードをまとめます。
この記事でわかること
・画像処理ライブラリの比較(ImageSharp / SkiaSharp / System.Drawing)
・サムネイル生成(リサイズ)
・JPEG圧縮(品質調整)
・フォーマット変換(PNG → JPEG など)
・大量画像の高速処理
・非同期処理とメモリ対策
・業務アプリ向けベストプラクティス
・画像処理ライブラリの比較(ImageSharp / SkiaSharp / System.Drawing)
・サムネイル生成(リサイズ)
・JPEG圧縮(品質調整)
・フォーマット変換(PNG → JPEG など)
・大量画像の高速処理
・非同期処理とメモリ対策
・業務アプリ向けベストプラクティス
1. C#で使える画像処理ライブラリ比較
| 項目 | ImageSharp | SkiaSharp | System.Drawing |
|---|---|---|---|
| 特徴 | 高品質・クロスプラットフォーム | 高速・軽量 | 古い・非推奨(Linux不可) |
| 速度 | ○ | ◎(最速) | △ |
| 商用利用 | 有償ライセンス必要 | 無料 | 無料 |
| 推奨度 | ◎(品質重視) | ◎(速度重視) | ×(新規利用非推奨) |
品質重視 → ImageSharp 速度重視 → SkiaSharp System.Drawing → 新規では使わない
2. ImageSharpでサムネイル生成(高品質)
■ 2-1. 基本のリサイズ(サムネイル生成)
using SixLabors.ImageSharp;
using SixLabors.ImageSharp.Processing;
using var image = Image.Load("input.jpg");
image.Mutate(x => x.Resize(new ResizeOptions
{
Mode = ResizeMode.Max,
Size = new Size(300, 300)
}));
image.Save("thumb.jpg");
縦横比を維持したまま、最大300pxに収まるサムネイルを生成します。
■ 2-2. JPEG圧縮(品質調整)
image.Save("compressed.jpg", new JpegEncoder
{
Quality = 70 // 0〜100
});
品質70は「見た目ほぼ同じ・ファイルサイズ半分」が目安です。
3. SkiaSharpで高速サムネイル生成(最速)
■ 3-1. リサイズ
using SkiaSharp;
using var input = File.OpenRead("input.jpg");
using var bitmap = SKBitmap.Decode(input);
var resized = bitmap.Resize(new SKImageInfo(300, 300), SKFilterQuality.Medium);
using var image = SKImage.FromBitmap(resized);
using var data = image.Encode(SKEncodedImageFormat.Jpeg, 80);
File.WriteAllBytes("thumb.jpg", data.ToArray());
SkiaSharpはとにかく速いので、大量画像処理に向いています。
4. System.Drawing(非推奨だが既存資産向け)
System.Drawing は .NET 6 以降で非推奨(Linux非対応)。
新規開発では ImageSharp / SkiaSharp を使うべきです。
■ 4-1. リサイズ
using var src = Image.FromFile("input.jpg");
using var dst = new Bitmap(300, 300);
using var g = Graphics.FromImage(dst);
g.DrawImage(src, 0, 0, 300, 300);
dst.Save("thumb.jpg", ImageFormat.Jpeg);
5. フォーマット変換(PNG → JPEG)
■ ImageSharp
using var image = Image.Load("input.png");
image.Save("output.jpg", new JpegEncoder { Quality = 80 });
■ SkiaSharp
using var bitmap = SKBitmap.Decode("input.png");
using var image = SKImage.FromBitmap(bitmap);
using var data = image.Encode(SKEncodedImageFormat.Jpeg, 80);
File.WriteAllBytes("output.jpg", data.ToArray());
6. 大量画像の高速処理(1000枚〜1万枚)
大量画像を処理する場合は、 並列処理(Parallel.ForEach)+ SkiaSharp が最速です。
■ 6-1. 並列サムネイル生成
var files = Directory.GetFiles("images", "*.jpg");
Parallel.ForEach(files, file =>
{
using var bitmap = SKBitmap.Decode(file);
var resized = bitmap.Resize(new SKImageInfo(300, 300), SKFilterQuality.Medium);
using var image = SKImage.FromBitmap(resized);
using var data = image.Encode(SKEncodedImageFormat.Jpeg, 80);
var outPath = Path.Combine("thumbs", Path.GetFileName(file));
File.WriteAllBytes(outPath, data.ToArray());
});
CPUコア数をフル活用して高速化できます。
7. 非同期処理(UIフリーズ防止)
WPF / WinUI などのUIアプリでは、 画像処理は必ずバックグラウンドで実行します。
■ 7-1. 非同期で画像処理
public async Task CreateThumbnailAsync(string input, string output)
{
await Task.Run(() =>
{
using var image = Image.Load(input);
image.Mutate(x => x.Resize(300, 300));
image.Save(output);
});
}
UIスレッドをブロックしないため、アプリが固まらなくなります。
8. メモリ対策(OutOfMemory防止)
- 画像は using で確実に Dispose
- 巨大画像は先に縮小してから処理
- 並列処理は CPU コア数に合わせて制限
- ImageSharp はメモリ使用量が多め → SkiaSharpが有利
9. 業務アプリ向けベストプラクティス
- 品質重視 → ImageSharp
- 速度重視 → SkiaSharp
- System.Drawing は新規利用しない
- サムネイルは縦横比を維持してリサイズ
- JPEG圧縮は Quality=70〜85 が実用的
- 大量処理は Parallel.ForEach + SkiaSharp
- UIアプリでは必ず非同期処理
まとめ:C#の画像処理は“ImageSharp × SkiaSharp”で完結する
- ImageSharp → 高品質・柔軟・帳票向け
- SkiaSharp → 高速・大量処理向け
- 非同期+並列処理で体感速度UP
- フォーマット変換・圧縮・サムネイル生成は数行で実装可能
「画像が重い」「サムネイルを自動生成したい」 という現場のニーズに対して、 C#の画像処理は非常に強力な解決策になります。 この記事をベースに、あなたのアプリに最適な画像処理フローを設計してみてください。