gpt4 book ai didi

c# - 允许多个线程访问图像

转载 作者:太空狗 更新时间:2023-10-29 20:54:40 26 4
gpt4 key购买 nike

我正在尝试用 C# 进行一些图像处理。我想使用一些线程对图像中的多个区域进行并行计算。线程实际上是获取和设置 Bitmap 对象中的像素。 2 个线程绝对不可能访问同一个像素,所以这不是问题。

问题是 C# 不允许我在同一个位图对象上启动多个线程,即使我确定不会同时读取和修改同一个像素也是如此。

有什么方法可以避免 C# 引发此错误?还是不可能在我的 Bitmap 对象上运行多个线程?

谢谢,

皮埃尔-奥利维尔

最佳答案

使用 LockBits (这也比 GetPixelSetPixel 快得多)您可以将图像的像素复制到缓冲区,在其上运行并行线程,然后将缓冲区复制回来。

这是一个工作示例。

void Test()
{
string inputFile = @"e:\temp\a.jpg";
string outputFile = @"e:\temp\b.jpg";

Bitmap bmp = Bitmap.FromFile(inputFile) as Bitmap;

var rect = new Rectangle(0, 0, bmp.Width, bmp.Height);
var data = bmp.LockBits(rect, ImageLockMode.ReadWrite, bmp.PixelFormat);
var depth = Bitmap.GetPixelFormatSize(data.PixelFormat) / 8; //bytes per pixel

var buffer = new byte[data.Width * data.Height * depth];

//copy pixels to buffer
Marshal.Copy(data.Scan0, buffer, 0, buffer.Length);

Parallel.Invoke(
() => {
//upper-left
Process(buffer, 0, 0, data.Width / 2, data.Height / 2, data.Width, depth);
},
() => {
//lower-right
Process(buffer, data.Width / 2, data.Height / 2, data.Width, data.Height, data.Width, depth);
}
);

//Copy the buffer back to image
Marshal.Copy(buffer, 0, data.Scan0, buffer.Length);

bmp.UnlockBits(data);

bmp.Save(outputFile, ImageFormat.Jpeg);
}

void Process(byte[] buffer, int x, int y, int endx, int endy, int width, int depth)
{
for (int i = x; i < endx; i++)
{
for (int j = y; j < endy; j++)
{
var offset = ((j * width) + i) * depth;
// Dummy work
// To grayscale (0.2126 R + 0.7152 G + 0.0722 B)
var b = 0.2126 * buffer[offset + 0] + 0.7152 * buffer[offset + 1] + 0.0722 * buffer[offset + 2];
buffer[offset + 0] = buffer[offset + 1] = buffer[offset + 2] = (byte)b;
}
}
}

输入图像:

enter image description here

输出图像:

enter image description here

一些粗略的测试:

双核 2.1GHz 机器上将(41 兆像素,[7152x5368])图像转换为灰度

  • GetPixel/SetPixel - 单核 - 131 秒。
  • LockBits - 单核 - 4.5 秒。
  • LockBits - 双核 - 3 秒。

关于c# - 允许多个线程访问图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21497537/

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