C# bitmap保存到缓存,取出数据bitmap数据无效【解决方法】

如果遇到了在将 Bitmap 保存到缓存后,从缓存中取出数据时 Bitmap 数据无效的问题,这通常是因为在将图像数据存入缓存时,数据没有被正确地序列化或者在从缓存读取数据时没有正确地反序列化。在处理 Bitmap 对象时,一个常见的做法是将其转换为一个字节数组,然后存储这个字节数组,因为直接存储 Bitmap 对象可能会导致一些序列化和反序列化的问题。

下面展示如何将 Bitmap 转换为字节数组,并将其保存到内存缓存中,然后再从缓存中读取并恢复为 Bitmap:
1、将 Bitmap 转换为字节数组

using System.Drawing;
using System.Drawing.Imaging;
using System.IO;

public static byte[] ConvertBitmapToByteArray(System.Drawing.Bitmap bitmap)
{
   
    if (bitmap == null)
        throw new ArgumentNullException("bitmap");

    using (MemoryStream memoryStream = new MemoryStream())
    {
   
        bitmap.Save(memoryStream, ImageFormat.Png); // 使用PNG格式保存图像
        return memoryStream.ToArray();
    }
}

2、将字节数组转换回 Bitmap

public static Bitmap ConvertByteArrayToBitmap(byte[] byteArray)
{
   
    if (byteArray == null)
        throw new ArgumentNullException("byteArray");

    using (MemoryStream memoryStream = new MemoryStream(byteArray))
    {
   
        return new Bitmap(memoryStream);
    }
}

3、示例使用内存缓存存储和读取 Bitmap
这里以 System.Runtime.Caching.MemoryCache 为例来展示如何使用缓存。首先,你需要添加对 System.Runtime.Caching 的引用。

using System.Runtime.Caching;

public void SaveBitmapToCache(string cacheKey, Bitmap bitmap)
{
   
    MemoryCache memoryCache = MemoryCache.Default;
    byte[] bitmapBytes = ConvertBitmapToByteArray(bitmap);
    memoryCache.Set(cacheKey, bitmapBytes, DateTimeOffset.UtcNow.AddMinutes(5)); // 缓存5分钟
}

public Bitmap GetBitmapFromCache(string cacheKey)
{
   
    MemoryCache memoryCache = MemoryCache.Default;
    byte[] bitmapBytes = memoryCache.Get(cacheKey) as byte[];

    if (bitmapBytes == null)
    {
   
        return null;
    }

    return ConvertByteArrayToBitmap(bitmapBytes);
}

注意事项

  1. 在将 Bitmap 保存到缓存时,我们首先将其转换为字节数组。这样做的好处是可以避免直接序列化 Bitmap 对象可能遇到的问题。
  2. 在从缓存中读取数据时,我们将字节数组转换回 Bitmap。这确保了无论 Bitmap 在缓存中存储了多久,都能够正确地恢复。
  3. 使用 MemoryStream 在转换过程中作为中介,确保了数据的完整性和正确性。 设置缓存的过期时间可以防止缓存无限制增长。

通过上述步骤,你可以安全地将 Bitmap 对象保存到缓存中,并在需要时正确地从缓存中读取和恢复 Bitmap 数据。

相关推荐

  1. 额外加餐-关于使用bitmap解决缓存穿透的方案

    2024-02-04 06:14:02       81 阅读
  2. 保存Json对象数据库

    2024-02-04 06:14:02       53 阅读
  3. python--scrapy 保存数据 mongodb

    2024-02-04 06:14:02       43 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-02-04 06:14:02       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-02-04 06:14:02       106 阅读
  3. 在Django里面运行非项目文件

    2024-02-04 06:14:02       87 阅读
  4. Python语言-面向对象

    2024-02-04 06:14:02       96 阅读

热门阅读

  1. kafka排除zookeeper使用kraft的最新部署方案

    2024-02-04 06:14:02       46 阅读
  2. kafka自定义分区策略详解

    2024-02-04 06:14:02       43 阅读
  3. Xlua分析:C#调用Lua

    2024-02-04 06:14:02       40 阅读
  4. 数组和List之间的相互转换

    2024-02-04 06:14:02       49 阅读
  5. 2024.2.3

    2024.2.3

    2024-02-04 06:14:02      44 阅读
  6. 开源模型应用落地-业务优化篇(四)

    2024-02-04 06:14:02       46 阅读
  7. Node.js版本管理工具之_GNVM

    2024-02-04 06:14:02       40 阅读
  8. vue实现二维数组表格渲染

    2024-02-04 06:14:02       52 阅读
  9. 超越原生:探索Node.js中最佳文件系统三方库

    2024-02-04 06:14:02       44 阅读
  10. 类银河恶魔城学习记录1-8 PlayerDash补全 P35

    2024-02-04 06:14:02       45 阅读