问题标签 [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 投票
1 回答
1909 浏览

c# - C# 使用 Bitmap LockBits 处理 bmp 图像。尝试更改所有字节,但保存后其中一些字节的值仍然为 0。为什么?

我需要使用带有 LockBits 的图像处理而不是 GetPixel/SetPixel 来减少处理时间。但最终它不会保存所有更改。

重现问题的步骤:

  • 从初始 bmp 文件中读取所有字节;
  • 更改所有这些字节并将其保存到新文件中;
  • 读取保存的文件并将其数据与您尝试保存的数据进行比较。

预期:它们是相等的,但实际上它们不是。

我注意到(见输出):

  • 所有错误的值都等于 0,
  • 错误值的索引如下:x1, x1+1, x2, x2+1, ...,
  • 对于某些文件,它可以按预期工作。

更令人困惑的事情是:我的初始测试文件是灰色的,但在 HexEditor 中,在预期的有效负载值中,我们可以看到值“00 00”。见这里这意味着什么?

我在 Stack Overflow、MSDN、CodeProject 和其他网站上阅读并尝试了很多 LockBits 教程,但最终它的工作方式相同。

所以,这里是代码示例。的代码MyGetByteArrayByImageFileUpdateAllBytes直接来自 msdn 文章“如何:使用 LockBits”(方法MakeMoreBlue),有一些小的改动:硬编码的像素格式被替换,每个字节都在变化(而不是每 6 个)。

内容Program.cs

内容ImageExtensions.cs

输出示例:

如果有人能解释为什么会发生这种情况以及如何解决这个问题,我将不胜感激。非常感谢。


解决方案

根据Joshua Webb 的回答,我更改了代码:

在文件Program.cs中,我只更改UpdateAllBytes了使用新扩展方法的方法UpdateBitmapPayloadBytes

ImageExtensions.cs:

此代码通过了图像测试:

  • 8、24、32 bpp;
  • 当需要而不是填充字节时(例如,width = 63, bpp = 24 and width = 64, bpp = 24, ...)。

在我的任务中,我不必关心我正在更改哪些值,但是如果您需要计算红色、绿色、蓝色值的确切位置,请记住字节按 BGR 顺序排列,如答案中所述。

0 投票
2 回答
348 浏览

c# - C#,Lockbits 图像处理与人工制品,改变像素格式

我实现了我自己的函数来二值化指纹图像。在我的方法中,我第一次尝试使用LockBits

你能解释一下,为什么我的图像上有很多伪影吗?示例:

在此处输入图像描述

在左边的图片上,我对图像进行了二值化Get/SetPixel,它工作得很好,但是为什么我不能在右边的图像上得到同样好的结果(很多红点)?我是否忘记或不知道某事?

同样的历史,当我想从图像中删除一点字节时,问题看起来有点复杂。

在此处输入图像描述

为什么它甚至没有进入好的“如果”声明?

感谢您提供任何改进我的功能的建议。

0 投票
1 回答
96 浏览

c# - C#, ”?” 和“:”运算符

我没有为我的问题找到任何解决方案,所以我问,当我有多个语句时?,运算符如何工作?:

我想做的是,我在中间有像素,pixel[pos]周围有像素,它看起来像:

x是一个中心像素。

我正在检查,如果我周围有任何白色 ( zero) 像素。如果有人,我将像素标记为two。如果不是,那么模式看起来像:

1是一个黑色像素,我将其设置为one.

现在,代码:

我的问题是,为什么每个one像素都被标记为two?为什么它没有识别像素,每个像素都在哪里one(如第二个模式)?

感谢您的任何建议!

0 投票
1 回答
79 浏览

c# - 基于locked bitmap、getpixel和优化辅助函数提高视频校正算法的速度

我编写此代码是为了消除由于相机故障而导致的视频中恼人的模式。问题是要编码一个 2 分钟的视频,这个算法需要超过2 个小时。我想显着减少所需的时间。

该算法迭代每个图像,从那里查看每 4 个像素,创建平均值,如果平均值低于阈值,则将当前像素设置为白色。我可以使用 step = 2 并将 2x2 矩阵设置为白色,但这会降低图像质量并且只会将速度提高一半。

我已经添加了lockbitmap,lockbits并改进了辅助功能。

在 -snippet之前和之后,using (d2 = reader.ReadVideoFrame())我有一个基于 ffmpeg 的 aforge 视频阅读器和作家。

辅助功能:

LockBitmap是从这里

0 投票
0 回答
415 浏览

c# - LockBits 获取像素 (X, Y)

目前我有这个,我正在搜索 RGB 值(208、94、94),如果匹配,它将告诉我的 DX 设备在屏幕上绘图并将其记录在控制台中。

好吧,我不确定如何获得像素的确切 X、Y 坐标。Y 很好,不是问题,但 X 总是关闭并且值很高。我应该如何获得 X,Y?有公式还是我的代码错了?有没有办法在 LockBits 中使用 GetPixel 并且速度很快?

例如它打印:

x: 3772 y: 187 当实际值为: 944, 187

x: 3888 y: 212 当实际值为: 973, 212

x: 3788 y: 224 当实际值为: 948, 224

0 投票
0 回答
18 浏览

c# - Window7 C# Debug & Release 程序,差异值(处理位图)

我正在对这两个程序(Window7 C# Debug & Release Program)进行大量测试。

标签 : Window7, C#, Bitmap, Lockbits, 字节

内容如下。

位图规格(图像尺寸:3072X3072) 在此处输入图像描述

使用这两个程序,内容重复1000次,得到大约30个不同的结果。

我有一个可疑的地方。(位图、字节、255 值、扫描、锁定位)

除了我说的以外,还有什么我怀疑的地方吗?

感谢您阅读本文。请给我们各种意见。

0 投票
5 回答
9878 浏览

avr - AVR 工作室错误“得到 0xc0,预期为 0x00”

所以我有 5 个使用我设计的 ATmega 2560 的板。它们都已正确接线,最初能够使用 AVRISP mk2 与 AtmelStudio 工作室进行通信。第一块板能够闪烁,设置了锁定位和保险丝,之后它仍然能够与编程器通信。第二块板最初能够刷新程序,并设置了锁定位,但在设置保险丝后,我得到了错误:

“无法进入编程模式。ispEnterProgMode:收到错误状态:得到 0xc0,预期为 0x00(命令未能在工具上执行)

无法进入编程模式。验证设备选择、接口设置、目标电源、安全位以及与目标设备的连接。”

我什至无法读取设备签名。我想可能是芯片有问题,因为我有 3 个其他板可以使用,所以我忽略了它。在对第三块板进行编程时,我经历了相同的过程,并出现了同样的错误。但是第四块板在做同样的事情时工作。

我还是 AVR 领域的新手,如果能帮助我让损坏的 2 块板正常工作,我将不胜感激。我知道晶体(16MHz)或编程器,甚至 ISP 时钟(125kHz)都不是问题。&它与接线无关。我尝试擦除有故障的芯片,但无法这样做,并且一直出现相同的错误。有没有办法让芯片重置为库存,或者只是能够重新建立与芯片的通信。

程序如下: 1) 刷新芯片 2) 将锁定位设置为“0xCF” 3) 将保险丝设置为“EXTENDED 0xFD”、“HIGH 0xD8”、“LOW 0xFF” 4) 再次刷新芯片并接收错误。

0 投票
1 回答
730 浏览

c# - 多线程中的 C# 位图 LockBits/UnlockBits

我正在从事一个使用 ONVIF 的闭路电视项目。我使用“ONVIF 设备管理器”项目提供的 Winform 示例从相机获取视频帧。(你可以在这里找到它)。我发现该示例使用 dispatcher.BeginInvoke() 在 UI 线程中放置了 CopyMemory() 块代码。我会减慢主 UI 线程,因为重复此块以在 PictureBox 中显示图像。

我试图通过在UnlockBits()位图之后调用BeginInvoke()来排除UI 线程之外的CopyMemory()语句。但是,会引发错误“位图已锁定”。有一个问题已发布,我已按照该问题的答案进行操作,但在重绘 imageBox 时出现另一个错误“参数无效”。我猜如果我们锁定位图lock(bmp) {CopyMemory();...} imageBox 无法获取与其关联的位图信息。

非常感谢任何帮助。

更新建议的解决方案

0 投票
1 回答
569 浏览

c# - 将字节数组复制到位图时,LockBits 似乎导致步幅错误

我正在尝试将一个简单的字节数组复制到一个 8 位索引位图。使用与许多论坛上无数回答问题中显示的完全相同的代码,我仍然得到错误的结果。我试图写入图像文件的数据是 360 字节,设置为 18x20 字节线性数组。也就是说,前 18 个字节(0-17)属于图像的顶行,接下来的 18 个字节(18-35)属于第 2 行,依此类推。我已经确认这个数据是正确的,我可以在 Excel 中手动解析它(甚至通过设置单元格的背景颜色将其可视化)。但是,当我尝试使用 c# 中的代码提取此内容时,我得到了格式错误的图像。这是代码...

结果如下。第一行写入正确。但是,从第二行开始,有一个 2 字节的偏移量。也就是说,图像第二行的第一个字节最终是字节#20,而不是字节#18(从0开始)。此外,如果我在 LockBits 调用后立即设置断点,我可以看到 bmpData 的“步幅”属性等于 20...即使宽度明确设置为 18。而且,如果我手动将步幅设置为18、LockBits后,对返回的位图没有影响。为什么会这样?请帮忙,谢谢。

0 投票
2 回答
1346 浏览

c# - LockBits/UnlockBits 在 C# 中有什么作用?

我在 c# 中有一个方法,它唯一做的是 LockBits,然后是 UnlockBits,并且图像(输入/输出,转换为字节数组)是不同的。来自输出的字节比来自输入的字节少 100 个字节。这只发生在 .jpg 文件中。检查 HxD 中的文件后,我了解到它删除了标题的一部分,确切地说是 exif 签名。但我不知道如何以及为什么。

有人知道这是在做什么吗?

这是代码: