gpt4 book ai didi

.net - 如何将位图存储在.NET的内存中?

转载 作者:行者123 更新时间:2023-12-04 13:20:09 25 4
gpt4 key购买 nike

在.NET中,通常使用Bitmap类存储图像。要快速访问它,您需要调用lock() and unlock()将位图的内容复制到内存中。那么,这是否意味着位图在锁定之前未存储在压缩存储阵列中?

究竟是什么需要锁定?即为什么平台不能简单地将指针返回到位图的第一个像素并让您直接访问这些像素? (除了“不安全”的内存访问注意事项之外)

一些可能的原因:

  • 位图以其原始压缩形式存储,以节省内存(PNG,JPEG等)。
  • 位图以24-bpp格式存储,因此其访问速度比32-bpp图像
  • 该位图未存储在打包的内存阵列中,并且是碎片化的,因此无法快速读写
  • 位图以未公开的方式存储,并且平台不希望您访问实际的位图数据内存-强制您使用lock()
  • 在内存中创建其副本

    最佳答案

    位图以惰性方式读取。实际使用的算法在很大程度上取决于图像格式,.bmp文件很容易,.jpeg并不是那么容易。在后台,GDI +创建一个内存映射文件,以便在必要时利用操作系统的按需分页虚拟内存映射功能将文件数据映射到RAM。正是该MMF臭名昭著地在文件上创建了一个锁,并负责将图像保存回具有相同名称的文件时遇到的棘手异常。

    Bitmap.LockBits()创建一个单独的缓冲区,该缓冲区将来自MMF的像素数据映射到内存中具有所请求像素格式的区域。现在,您可以使用定义明确的格式的数据,而该格式与文件中的格式无关。调用UnlockBits()会将修改后的数据写回(如果有的话)。尚未确切说明文件中的数据如何与修改后的像素重新组合,并且可能很大程度上取决于编解码器。

    当您在其他方法中使用位图时,这种完全相同的锁定会发生,这是看不见的。就像使用Graphics.DrawImage()绘制图像时一样。臭名昭著的是,当您使用Bitmap.GetPixel()时。您现在可以猜到,在锁定调用时转换像素数据会涉及相当多的开销,这是因为GetPixel()这么慢的原因,因为您需要对位图中的每个像素(而不是一次)进行处理,例如DrawImage和LockBits()可以。

    还应该清楚的是,开销量很大程度上取决于图像文件格式,动态解码像素数据的开销,解码器完成的缓存量,文件的像素格式与您在LockBits()中要求的像素格式。这里有太多事情要做,无法做出可预测的性能猜测,因此您必须对此进行概要分析。

    关于.net - 如何将位图存储在.NET的内存中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13495382/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com