我的位图有什么问题?如何得到我画的像素数据
本文关键字:像素 数据 像素数 何得 位图 什么 问题 我的 | 更新日期: 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;
当我设置PixBuffer
为BackgroundImage
-我得到我绘制的图像。当我将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()
方法绘制。这里没有魔法。只是人为错误。