C#で画像ファイルをキャッシュするプログラム(SQLite)

コンピュータ

画像ファイルを読み込んでキャッシュとしてSQLiteのデータベースにBlobとして保存するコードになります。

プロジェクトを作成

cd (mkdir ImageCacheStore01 -Force)
dotnet new winforms -f net8.0
dotnet add package System.Data.SQLite.Core

ソースコード

ファイル名:ImageCacheStore.cs

using System.Data.SQLite;
public class ImageCacheStore : IDisposable
{
    private readonly SQLiteConnection _conn;

    public ImageCacheStore(string dbPath)
    {
        _conn = new SQLiteConnection($"Data Source={dbPath};Version=3;");
        _conn.Open();

        using var cmd = new SQLiteCommand(@"
            CREATE TABLE IF NOT EXISTS image_cache (
                key TEXT PRIMARY KEY,
                image BLOB NOT NULL,
                update_at DATETIME DEFAULT CURRENT_TIMESTAMP
            );
        ", _conn);
        cmd.ExecuteNonQuery();
    }

    public void SaveImage(string key, Bitmap image)
    {
        using var ms = new MemoryStream();
        image.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
        var imageBytes = ms.ToArray();

        using var cmd = new SQLiteCommand(@"
            INSERT OR REPLACE INTO image_cache (key, image, update_at)
            VALUES (@key, @image, CURRENT_TIMESTAMP);
        ", _conn);
        cmd.Parameters.AddWithValue("@key", key);
        cmd.Parameters.AddWithValue("@image", imageBytes);
        cmd.ExecuteNonQuery();
    }

    public Bitmap? LoadImage(string key)
    {
        using var cmd = new SQLiteCommand("SELECT image FROM image_cache WHERE key = @key;", _conn);
        cmd.Parameters.AddWithValue("@key", key);

        using var reader = cmd.ExecuteReader();
        if (reader.Read())
        {
            var blob = (byte[])reader["image"];
            using var ms = new MemoryStream(blob);
            return new Bitmap(ms);
        }

        return null;
    }

    public void Dispose()
    {
        _conn.Dispose();
    }
}

ファイル名:Form1.cs


namespace ImageCacheStore01;

public partial class Form1 : Form
{
    ImageCacheStore _store;
    PictureBox _picbox = new()
    {
        Dock = DockStyle.Fill,
    };
    public Form1()
    {
        InitializeComponent();

        _store = new("image_cache.db");

        this.Controls.Add(_picbox);

    }
    protected override void OnLoad(EventArgs e)
    {
        base.OnLoad(e);

        string path = @"G:\csharp\WinForms\ImageCacheStore01\2025-06-28105457.png";
        using var bmp = new Bitmap(path);

        // 保存
        _store.SaveImage(path, bmp);

        // 取得
        var cached = _store.LoadImage(path);
        if (cached != null)
        {
            _picbox.Image = cached;
        }        
    }
    protected override void OnClosed(EventArgs e)
    {
        base.OnClosed(e);
        _store.Dispose();
    }
}

コメント