gpt4 book ai didi

c# - 在 C# 中使用锁定位写入图像

转载 作者:行者123 更新时间:2023-11-30 14:58:35 24 4
gpt4 key购买 nike

我正在优化我正在处理的程序,该程序当前使用锁定位读取字节数据,但使用 setPixel 写入像素数据。那么我如何实际修改我正在读入的像素数据呢?如果我尝试设置 pp、cp 或 np,该方法将不起作用(因为它循环并需要 pp、cp 和 np 来表示像素数据),所以我完全糊涂了。我需要将像素数据写入 byte[] 并对其进行操作,还是什么?

这是一个代码示例:

BitmapData data = img.LockBits(new Rectangle(0, 0, img.Width, img.Height),
ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);

int scaledPercent = (int)(Math.Round(percentageInt * 255)) - 47;
Debug.WriteLine("percent " + scaledPercent);
unsafe
{
Debug.WriteLine("Woah there, unsafe stuff");
byte* prevLine = (byte*)data.Scan0;
byte* currLine = prevLine + data.Stride;
byte* nextLine = currLine + data.Stride;

for (int y = 1; y < img.Height - 1; y++)
{
byte* pp = prevLine + 3;
byte* cp = currLine + 3;
byte* np = nextLine + 3;
for (int x = 1; x < img.Width - 1; x++)
{
if (IsEdgeOptimized(pp, cp, np, scaledPercent))
{
//Debug.WriteLine("x " + x + "y " + y);
img2.SetPixel(x, y, Color.Black);
}
else
{
img2.SetPixel(x, y, Color.White);
}
pp += 3; cp += 3; np += 3;
}
prevLine = currLine;
currLine = nextLine;
nextLine += data.Stride;
}
}
img.UnlockBits(data);
pictureBox2.Image = img2;

最佳答案

与将原始位作为数组获取相比,SetPixel 的使用速度较慢。看起来你正在做某种边缘检测(?)。 MSDN (http://msdn.microsoft.com/en-us/library/5ey6h79d.aspx) 上的 LockBits 示例展示了如何获取原始数组并使用它,将结果保存回原始图像。

该示例中有趣的部分是使用 Marshal.copy 复制指针的字节:

        // Get the address of the first line.
IntPtr ptr = bmpData.Scan0;

// Declare an array to hold the bytes of the bitmap.
int bytes = Math.Abs(bmpData.Stride) * bmp.Height;
byte[] rgbValues = new byte[bytes];

// Copy the RGB values into the array.
System.Runtime.InteropServices.Marshal.Copy(ptr, rgbValues, 0, bytes);

现在您在 rgbValues 数组中有了所需的值,可以开始操作这些值了

关于c# - 在 C# 中使用锁定位写入图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18620277/

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