我有一些代码,可以将Bitmap复制到Direct3D Texture中来渲染视频。当系统负载过重时,我偶尔会在调用Bitmap.LockBits时收到AccessViolationException。
下面是一个非常简单的例子:
// Get a PixelFormat.Format24bppRgb image
Bitmap bitmap24 = getVideoFrame();
// Copy into a 32bpp ARGB texture
BitmapData bitmapData = null;
try
{
// Why am I allowed to do this?
bitmapData = this.bitmap24.LockBits(new Rectangle(0, 0, bitmap.Width, bitmap.Height),
ImageLockMode.ReadOnly,
PixelFormat.Format32bppArgb);
// Blit from bitmapData to texture32
Texture texture32 = convertBitmapToTexture(bitmapData);
}
finally
{
if (bitmapData != null)
this.bitmap.UnlockBits(bitmapData);
}当我知道位图格式是PixelFormat.Format24bppRgb时,为什么允许我调用Bitmap.LockBits并传入PixelFormat.Format32bppArgb?我假设LockBits必须自动从每像素3字节扩展到4字节。
这些异常可能是由LockBits扩展引起的吗?为什么它只会偶尔发生呢?
发布于 2012-08-22 07:57:03
LockBits将以您指定的任何格式将位图存储在内存中。
当你正在访问你不应该访问的内存时,就会发生AccessViolationException。我可以想象出两种情况:
1)您正在使用ImageLockMode.ReadOnly..有没有什么地方你真的想改变一个像素的值?也许可以尝试将其更改为ImageLockMode.ReadWrite,看看这是否有帮助。
2)您对缓冲区必须有多大感到困惑,并且您的convertBitmapToTexture函数中有一个试图复制到缓冲区末尾的Marshal.Copy。
当你使用32bppArgb时,你可能更容易用int而不是byte来思考,这样你就不太可能遇到任何混乱。
https://stackoverflow.com/questions/12064560
复制相似问题