我的位图有什么问题?如何得到我画的像素数据

本文关键字:像素 数据 像素数 何得 位图 什么 问题 我的 | 更新日期: 2023-09-27 18:10:48

这是我的动画缓冲区:

Bitmap PixBuffer;
下面是我创建它的方法:
PixBuffer = new Bitmap(ClientRectangle.Width, ClientRectangle.Height, PixelFormat.Format32bppArgb);

我是这样画的:

Graphics Renderer { get { return Graphics.FromImage(PixBuffer); } }

长话短说。它的工作原理。我画。我看到了变化。我使用位图作为窗口的BackgroundImage。由于窗口有DoubleBuffered = true,它是丝绸般光滑和快速。

好的,还有WTF部分。我试着克隆位图的一个切片,甚至整个图:

PixBuffer = (Bitmap)PixBuffer.Clone();

这没有多大意义,它应该对显示的内容没有任何影响。但是你猜怎么着——克隆是空的!如果我尝试在新的位图上绘制PixBuffer,结果完全相同。显示PixBuffer的内容。它甚至可以拉伸为窗口背景。但我没办法复制它。RotateFlip也没有效果

我做错了什么?如何获得我所画的像素数据?

                Freeze = (Bitmap)PixBuffer.Clone();
                using (var g = Graphics.FromImage(Freeze)) {
                    g.FillRectangle(BrushF, 0, 0, 100, 100);
                    g.CompositingMode = CompositingMode.SourceOver;
                    g.Dispose();
                }
                var test = (Bitmap)Freeze.Clone();
                BackgroundImage = test;

当我设置PixBufferBackgroundImage -我得到我绘制的图像。当我将Freeze设置为BackgroundImage -时,我得到了一个正方形。

然后,如果我将Freeze克隆到——假设是Freeze1——我仍然得到我的正方形,所以克隆实际上对一些位图有效。但是在PixBuffer上没有快乐!

PixBuffer不是在一帧内绘制的。它是在大约30秒内绘制的进度动画。动画完成后-我仍然有一个屏幕-这个屏幕我想要作为一个正常的位图来操作(如缩放等)。看起来PixBuffer是只写的。我还可以在上面画画,但是我不能从上面复制任何东西。

我甚至试图将其转换为Icon,然后返回到Bitmap -但它与我在空Bitmap对象上做操作完全相同。

但它不是空的!我测试了一下。我移除了BackgroundImage。我用另一个形象来代替它。然后我再次将PixBuffer设置为BacgroundImage -它不是空的,这就是我所画的。

我的位图有什么问题?如何得到我画的像素数据

这是代码中非常讨厌的bug之一。

    void RenderFrame(object sender, EventArgs e) {
        using (var r = Graphics.FromImage(PixBuffer)) r.Clear(Color.Transparent);
        var end = false;
        for (var i = 0; i < Speed; i++) if (end = !UnmaskOne()) break;
        RenderText();
        RenderPattern();
        if (end) FreezeContent = true;
        Refresh();
    }

我试着在UnmaskOne()方法中复制我的位图,这是在清除帧后直接调用的,因为这个方法可以检测,如果没有更多的东西可以打开遮罩。然而,我不得不等待复制位图-它应该首先用RenderText()RenderPattern()方法绘制。这里没有魔法。只是人为错误。