画像ファイルを読み込んでキャッシュとして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();
}
}
コメント