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

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

|| 我正在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格式。     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?