当用不安全的代码设置图像像素时,如何避免“噪点”

问题描述

|| 我正在C#winforms项目中使用\“ unsafe \”代码创建(然后更改)位图。每30毫秒左右一次。我遇到的问题是,“噪点”或随机像素有时会出现在生成的位图中,而我没有特别更改任何内容。 例如,我创建一个100x100的位图。使用
BitmapData
LockBits
,我遍历位图并将某些像素更改为特定颜色。然后我
UnlockBits
并设置一个图片框以使用该图像。我设置的所有像素都是正确的,但是我没有具体设置的像素有时似乎是随机颜色。 如果设置每个像素,噪点就会消失。但是,出于性能原因,我只希望设置最小数目。 谁能解释为什么这样做? 这是一些示例代码
// Create new output bitmap
Bitmap Output_Bitmap = new Bitmap(100,100);

// Lock the output bitmap\'s bits
Rectangle Output_Rectangle = new Rectangle(
    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)。右半部分会在其他黑色背景上产生随机噪音。     

解决方法

这有点投机,因为我不了解任何这些类的实现细节,但是我有一个猜测。 当您调用“ 4”时,代表位图像素的内存区域未初始化,因此包含了分配之前这些内存位置中的任何随机垃圾。第一次写入位图时,然后仅设置位置的一个子集,其他位置显示随机内存垃圾。 如果是这种情况,那么您必须确保在第一次更新时写入新的“ 5”中的每个像素。后续更新仅需要更新更改的像素。     ,您需要在位图上创建一个图形对象,并在创建位图后进行“ 6”调用,以避免位图内存处于未定义状态。 您还应该从
Format32bppRgb
更改为
Format32PbppRgb
,因为您没有设置alpha字节。要么切换到24 bpp格式。     

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...