gpt4 book ai didi

c# - 以这种方式使用锁位复制位图区域是否安全(双关语)?

转载 作者:太空狗 更新时间:2023-10-29 21:50:53 26 4
gpt4 key购买 nike

我想我已经找到了一种在 C# 中复制位图的更快的方法。 (如果它是有效的,我确定我不是第一个,但我还没有在任何地方看到它。)

我能想到的最简单的提问方式是断言我的想法是基于什么,如果没有人指出其中的漏洞,则假设这个想法是合理的:

    void FastCopyRegion(Bitmap CopyMe, ref Bitmap IntoMe, Rectangle CopyArea)
{
//`IntoMe` need not be declared `ref` but it brings
// attention to the fact it will be modified
Debug.Assert(CopyMe.PixelFormat == IntoMe.PixelFormat,
"PixelFormat mismatch, we could have a problem");
Debug.Assert(CopyMe.Width == IntoMe.Width, //This check does not verify
"Stride mismatch, we could have a problem");// sign of `stride` match
BitmapData copyData = CopyMe.LockBits(CopyArea,
ImageLockMode.ReadWrite, CopyMe.PixelFormat);
IntoMe.UnlockBits(copyData);
}

1) LockBits 只是将位图中的像素数据 block 复制到固定内存中进行编辑,然后使用 UnlockBits

复制回来

2) 使用 LockBits 不会影响复制的内存块,因此它应该不会影响从中复制的图像。

3) 由于您永远不会输入不安全代码,因此应该没有破坏内存的风险。

我看到的可能的漏洞:

1) 如果两个位图的PixelFormat不同,则此方法可能无法始终正确复制。但是,由于 LockBits 需要指定像素格式,所以这似乎已得到处理。 (如果是这样,为其他 99.9% 的时间我们没有切换像素格式的开销而欢呼吧!/EndSarcasm)

2) 如果两个位图的步长不匹配,可能会出现问题(因为 stride 是复制操作中 for 循环的外部增量。)这个问题会限制复制到步幅相等的位图。

编辑:我认为断言 #2 一定是错误的...我只是在稍后尝试访问通过 CopyMe 传递的位图时发现错误。下面的解决方法,但我不确定它是否会留下一 block 固定内存。 (内存泄漏警报!)

    void FastCopyRegion(Bitmap CopyMe, ref Bitmap IntoMe, Rectangle CopyArea)
{
//`IntoMe` need not be declared `ref` but it brings attention to the fact it will be modified
Debug.Assert(CopyMe.PixelFormat == IntoMe.PixelFormat, "PixelFormat mismatch, we could have a problem");
Debug.Assert(CopyMe.Width == IntoMe.Width, "Width mismatch, we could have a problem");
BitmapData copyD = IntoMe.LockBits(CopyArea, ImageLockMode.ReadWrite, CopyMe.PixelFormat);
BitmapData copyData = CopyMe.LockBits(CopyArea, ImageLockMode.ReadWrite, CopyMe.PixelFormat);
CopyMe.UnlockBits(copyData);
IntoMe.UnlockBits(copyData);
}

最佳答案

改用 Bitmap.Clone()。 GDI+ 往往不报告异常,由此产生的错误将很难跟踪。

将图像复制到位图中的一种非常快速的方法是使用 Graphics.DrawImage() 只要您不转换像素格式或缩放图片

关于c# - 以这种方式使用锁位复制位图区域是否安全(双关语)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14754142/

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