首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Bitmap.LockBits使用导致AccessViolation?

Bitmap.LockBits使用导致AccessViolation?
EN

Stack Overflow用户
提问于 2012-08-22 07:39:43
回答 1查看 577关注 0票数 0

我有一些代码,可以将Bitmap复制到Direct3D Texture中来渲染视频。当系统负载过重时,我偶尔会在调用Bitmap.LockBits时收到AccessViolationException

下面是一个非常简单的例子:

代码语言:javascript
复制
// 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扩展引起的吗?为什么它只会偶尔发生呢?

EN

回答 1

Stack Overflow用户

发布于 2012-08-22 07:57:03

LockBits将以您指定的任何格式将位图存储在内存中。

当你正在访问你不应该访问的内存时,就会发生AccessViolationException。我可以想象出两种情况:

1)您正在使用ImageLockMode.ReadOnly..有没有什么地方你真的想改变一个像素的值?也许可以尝试将其更改为ImageLockMode.ReadWrite,看看这是否有帮助。

2)您对缓冲区必须有多大感到困惑,并且您的convertBitmapToTexture函数中有一个试图复制到缓冲区末尾的Marshal.Copy

当你使用32bppArgb时,你可能更容易用int而不是byte来思考,这样你就不太可能遇到任何混乱。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12064560

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档