问题标签 [lockbits]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
4 回答
7238 浏览

c# - 比锁定位更快的图像处理

我一直在用 C# 编写一个边缘检测程序,为了让它运行得更快,我最近让它使用了锁定位。但是,lockBits 仍然没有我希望它运行的那么快。虽然问题可能是我的一般算法,但我也想知道是否有比 lockBits 更好的东西可以用于图像处理。

如果问题是算法,这里有一个基本的解释。遍历一个颜色数组(使用代表像素的锁定位制作),对于每种颜色,检查该像素周围八个像素的颜色。如果这些像素与当前像素的匹配不够紧密,则将当前像素视为边缘。

这是定义像素是否为边缘的基本代码。它接受九种颜色的 Color[],其中第一种是要检查的像素。

此代码适用于每个像素,其颜色是使用锁定位获取的。

所以基本上,问题是,我怎样才能让我的程序运行得更快?是我的算法,还是我可以使用比 lockBits 更快的东西?

顺便说一下,项目在gitHub上,这里

0 投票
7 回答
1625 浏览

c# - LockBits 似乎对我的需求来说太慢了 - 替代方案?

我正在处理由摄像机拍摄的 10 兆像素图像。

目的是在矩阵(二维数组)中注册每个像素的灰度值。

我第一次使用 GetPixel,但花了 25 秒才完成。现在我使用 Lockbits,但它需要 10 秒,如果我不将结果保存在文本文件中,则需要 3 秒。

我的导师说他们不需要注册结果,但3秒还是太慢了。那么我在我的程序中做错了什么,或者我的应用程序有什么比 Lockbits 更快的东西吗?

这是我的代码:

0 投票
1 回答
591 浏览

c# - C# - 从字节创建 BMP

我正在用 C# 创建一个 WinForm 应用程序,我可以用它来“嗅出”文件中的一些 24 位图。我已经收集了一些信息,例如它的偏移量、关于它是如何写入文件的一些分析以及它的长度。

因此,有关该文件的更多信息是:

  • BMP 数据反向写入。(例如:(255 0 0)被写入(0 0 255)
  • 它没有 BMP 标头。只有 BMP 的图像数据块。
  • 像素格式是 24 位的。
  • 它的 BMP 是纯品红色。(RGB 为 255 0 255)

我正在使用以下代码:

我得到这个输出。我认为原因是每当它到达下一行时字节就会变得混乱。(255 0 255 变为 0 255 255 并继续直到变为 255 255 0)

输出

我希望你能帮我解决这个问题。非常感谢您提前。

解决方案 现在通过添加此代码修复它(在我朋友的帮助和 James Holderness 提供的信息下)

非常感谢!

0 投票
4 回答
8198 浏览

visual-studio-2012 - Visual Studio 2012 - vshost32-clr2.exe 已停止工作

我正在使用 Visual Studio 2012 在 C# 中创建一个 WinForm 应用程序,并且在调试它时出现错误:

我已经搜索过,但大多数结果都是针对 Visual Studio 2010 及更低版本的,我得到了类似的解决方案,我认为这些解决方案不适用于 Visual Studio 2012:

来源:调用非托管 DLL 时 vshost32.exe 崩溃

额外细节 :

  • 我的项目不使用任何 DLL。

  • 就我的项目进展而言,它仅在宽度为17时发生。

我使用以下代码:

我认为发布我的代码是必要的,因为它仅在将此类值设置为我的方法时才会发生。

我希望你能帮我解决这个问题。非常感谢您!

0 投票
2 回答
4449 浏览

c# - 使用 Lockbits C# 进行边缘检测

我做了一个实现边缘检测算法的程序,但是处理起来需要很长时间。我读过关于使用 lockbits 和 unsafe state 而不是 getpixel 和 setpixel,但我仍然不明白如何使用它。

这是我的示例代码:

我正在使用 fastbitmap 类,我是这样实现的:

但是,图像根本没有改变。你能给我建议我的代码的哪一部分是错误的吗?

0 投票
3 回答
2725 浏览

c# - C# - 删除位图填充

我想知道是否有办法删除 24 位位图为每条扫描线生成的填充。

我的意思是这样的:

原版【纯青色 24 位 BMP】:

期望的输出[删除填充]:

这是我获取像素数据的代码。

先感谢您。

0 投票
1 回答
808 浏览

c# - c# 使用 Marshal.Copy() 将结构数组复制为字节

我在将结构数组复制为字节数组时遇到问题。这些结构是简单的 RGB 结构。

然后我有一个数组,它代表我想在调用后RGBColor[]复制到的扫描线。它只允许使用 复制数组。BitmapLockBits()byte[]Marshal.Copy()

如果我理解正确(请记住我不理解),我需要将RGBColor[]数组编组为字节数组,将数据复制到该新byte[]数组,然后将该数组复制到位图。似乎发生了不必要的复制操作,我有一个中间byte[]数组只是充当中间人。

有没有什么办法可以RGBColor[]转换,byte[]所以我可以直接将它复制到锁定的位图?

0 投票
1 回答
6240 浏览

c# - Read and write directly to Unlocked Bitmap unmanaged memory (Scan0)

Is that ok to Write and Read directly from a unlocked Bitmap unmanaged memory?

Can I keep using the BitmapData after I UnlockBits of the Bitmap? I did a test app where I can read the pixel of the Bitmap of a PictureBox at mouse position while another thread is writing pixels to the same Bitmap.

EDIT 1: As Boing have pointed out in his answer: "Scan0 does not point to the actual pixel data of the Bitmap object; rather, it points to a temporary buffer that represents a portion of the pixel data in the Bitmap object." from MSDN.

But once I get the Scan0, I'm able to read/write to the Bitmap without the need of Lockbits or UnlockBits! I'm doing this a lot of times in a thread. Accordingly to MSDN, it should not happen, because Scan0 points to a COPY of the Bitmap data! Well, in C# all the test shows that it is not a copy. In C++ I don't know if it works as it should.

EDIT 2: Using the rotate method some times makes the OS to free the Bitmap pixel data copy. Conclusion, it is not safe to read/write an unlocked Bitmap Scan0. Thanks Boing for your answer and comments!

Below is how I get the BitmapData and read and write the pixel value.

0 投票
1 回答
4946 浏览

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

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

这是一个代码示例:

0 投票
1 回答
854 浏览

c# - 当第二个监视器上的矩形时,LockBits() 抛出 ArgumentException

我正在开发一个小型应用程序,该应用程序需要在选定的监视器上显示一些生成的测试屏幕。我将这些屏幕生成为位图,为了方便和生成速度,我使用 LockBits() 方法来生成这些位图。

当我尝试在为此第二台监视器生成的位图上运行 LockBits 时,我看到的问题出现了。

如果我在使用取自主监视器边界的矩形生成的位图上运行 LockBits,则同样的代码可以正常工作,但如果矩形由第二个监视器的边界定义,则会引发 ArgumentException。相关的矩形成员如下:

我的第一个想法是,负 X 值可能会导致 LockBits 出现问题,但是用 X 的绝对值替换 X 值会产生相同的异常。当然,这一切都假定矩形是无效参数,但由于从我的主监视器生成的矩形工作正常,我认为它一定是 LockBits 不喜欢的第二个监视器的边界。

提前感谢您的任何建议。