gpt4 book ai didi

c# - 在不安全代码中设置图像像素时如何避免 "noise"

转载 作者:太空狗 更新时间:2023-10-29 22:54:58 28 4
gpt4 key购买 nike

我正在 C# winforms 项目中使用“不安全”代码创建(然后更改)位图。每 30 毫秒左右执行一次。我遇到的问题是“噪音”或随机像素有时会出现在生成的位图中,而我没有特别更改任何内容。

例如,我创建了一个 100x100 的位图。使用 BitmapDataLockBits,我遍历位图并将某些像素更改为特定颜色。然后我 UnlockBits 并设置一个图片框来使用图像。我设置的所有像素都是正确的,但我没有专门设置的像素有时看起来是随机颜色。

如果我设置每个像素,噪点就会消失。但是,出于性能原因,我宁愿只设置最小数量。

谁能解释一下为什么会这样?

下面是一些示例代码:

// Create new output bitmap
Bitmap Output_Bitmap = new Bitmap(100, 100);

// Lock the output bitmap's bits
Rectangle Output_Rectangle = new Rectangle(
0,
0,
Output_Bitmap.Width,
Output_Bitmap.Height);
BitmapData Output_Data = Output_Bitmap.LockBits(
Output_Rectangle,
ImageLockMode.WriteOnly,
PixelFormat.Format32bppRgb);

const int PixelSize = 4;
unsafe
{
for (int y = 0; y < Output_Bitmap.Height; y++)
{
for (int x = 0; x < Output_Bitmap.Width/2; x++)
{
Byte* Output_Row = (Byte*)Output_Data.Scan0 + y * Output_Data.Stride;
Output_Row[(x * PixelSize) + 2] = 255;
Output_Row[(x * PixelSize) + 1] = 0;
Output_Row[(x * PixelSize) + 0] = 0;
}
}
}

// Unlock the bits
Output_Bitmap.UnlockBits(Output_Data);

// Set picturebox to use bitmap
pbOutput.Image = Output_Bitmap;

在这个例子中,我只设置了图像的左半部分(内部 for 循环中的 Width/2)。右半部分在黑色背景上会有随机噪声。

最佳答案

这有点推测,因为我不知道这些类中的任何一个的实现细节,但我有一个猜测。

当您调用 new Bitmap(100, 100) 时,表示位图像素的内存区域未初始化,因此包含那些内存位置中的任何随机垃圾在分配之前。第一次写入位图时,您只设置了位置的一个子集,其他位置显示随机内存垃圾。

如果是这种情况,那么您必须确保在第一次更新新Bitmap 时写入每个 像素。后续更新只需要更新变化的像素即可。

关于c# - 在不安全代码中设置图像像素时如何避免 "noise",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5669407/

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