gpt4 book ai didi

c# - 使用共享源在位图上绘图

转载 作者:太空宇宙 更新时间:2023-11-03 13:13:56 25 4
gpt4 key购买 nike

我通过从另一个中提取 200x200 正方形来创建一个新的位图。我认为源(位图像素)由这两个共享。现在,当我在原始图像上画一个圆圈时,副本上也有一个。但是当我以相反的方式这样做时——在新创建的圆上画一个圆——原来的圆上没有圆。为什么会这样?我以为源像素是共享的。

    private Bitmap testa(Bitmap bmp)
{
System.Drawing.Imaging.BitmapData bmpData = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height), ImageLockMode.ReadOnly, bmp.PixelFormat);

//Create a new bitmap.
Bitmap newBitmap = new Bitmap(200, 200, bmpData.Stride, bmp.PixelFormat, bmpData.Scan0);

bmp.UnlockBits(bmpData);

// Draw the new bitmap.
using (Graphics g = Graphics.FromImage(bmp)) // or: newBitmap
{
g.DrawEllipse(new Pen(Brushes.Red), 1, 1, 100, 100);
}
return newBitmap;
}

最佳答案

基本上,您错误地使用了 LockBits()Bitmap() 构造函数,因此无论您看到什么行为,都纯粹是学术性的和不确定的。

您传递给 Bitmap(int, int, int, PixelFormat, IntPtr) 构造函数的 IntPtr 必须是您为此目的分配的特定位图。您需要确保 it remains valid for the lifetime of the Bitmap object .

另一方面,BitmapData.Scan0 指针保证仅在您调用 UnlockBits() 之前保持有效。到那时,它可能会也可能不会。

如果你很好奇,尝试其他实验可能会很有趣,比如在原始位图上绘制,查看新位图,然后在新位图上绘制,查看原始位图,最后再次在原始位图上绘制并查看新的。

但是无论您在这样的实验中发现什么行为,您都不能依赖它,因为该行为没有记录且不受支持。据我所知,没有支持的机制允许两个不同的 Bitmap 对象共享同一个缓冲区。它似乎在某些孤立的情况下起作用纯属运气。

关于c# - 使用共享源在位图上绘图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27299989/

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