问题标签 [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.
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 教程,但最终它的工作方式相同。
所以,这里是代码示例。的代码MyGetByteArrayByImageFile
和UpdateAllBytes
直接来自 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 顺序排列,如答案中所述。
c# - C#, ”?” 和“:”运算符
我没有为我的问题找到任何解决方案,所以我问,当我有多个语句时?
,运算符如何工作?:
我想做的是,我在中间有像素,pixel[pos]
周围有像素,它看起来像:
x
是一个中心像素。
我正在检查,如果我周围有任何白色 ( zero
) 像素。如果有人,我将像素标记为two
。如果不是,那么模式看起来像:
1
是一个黑色像素,我将其设置为one
.
现在,代码:
我的问题是,为什么每个one
像素都被标记为two
?为什么它没有识别像素,每个像素都在哪里one
(如第二个模式)?
感谢您的任何建议!
c# - 基于locked bitmap、getpixel和优化辅助函数提高视频校正算法的速度
我编写此代码是为了消除由于相机故障而导致的视频中恼人的模式。问题是要编码一个 2 分钟的视频,这个算法需要超过2 个小时。我想显着减少所需的时间。
该算法迭代每个图像,从那里查看每 4 个像素,创建平均值,如果平均值低于阈值,则将当前像素设置为白色。我可以使用 step = 2 并将 2x2 矩阵设置为白色,但这会降低图像质量并且只会将速度提高一半。
我已经添加了lockbitmap
,lockbits
并改进了辅助功能。
在 -snippet之前和之后,using (d2 = reader.ReadVideoFrame())
我有一个基于 ffmpeg 的 aforge 视频阅读器和作家。
辅助功能:
和
LockBitmap
是从这里。
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
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) 再次刷新芯片并接收错误。
c# - 多线程中的 C# 位图 LockBits/UnlockBits
我正在从事一个使用 ONVIF 的闭路电视项目。我使用“ONVIF 设备管理器”项目提供的 Winform 示例从相机获取视频帧。(你可以在这里找到它)。我发现该示例使用 dispatcher.BeginInvoke() 在 UI 线程中放置了 CopyMemory() 块代码。我会减慢主 UI 线程,因为重复此块以在 PictureBox 中显示图像。
我试图通过在UnlockBits()位图之后调用BeginInvoke()来排除UI 线程之外的CopyMemory()语句。但是,会引发错误“位图已锁定”。有一个问题已发布,我已按照该问题的答案进行操作,但在重绘 imageBox 时出现另一个错误“参数无效”。我猜如果我们锁定位图lock(bmp) {CopyMemory();...} imageBox 无法获取与其关联的位图信息。
非常感谢任何帮助。
更新建议的解决方案
c# - 将字节数组复制到位图时,LockBits 似乎导致步幅错误
我正在尝试将一个简单的字节数组复制到一个 8 位索引位图。使用与许多论坛上无数回答问题中显示的完全相同的代码,我仍然得到错误的结果。我试图写入图像文件的数据是 360 字节,设置为 18x20 字节线性数组。也就是说,前 18 个字节(0-17)属于图像的顶行,接下来的 18 个字节(18-35)属于第 2 行,依此类推。我已经确认这个数据是正确的,我可以在 Excel 中手动解析它(甚至通过设置单元格的背景颜色将其可视化)。但是,当我尝试使用 c# 中的代码提取此内容时,我得到了格式错误的图像。这是代码...
结果如下。第一行写入正确。但是,从第二行开始,有一个 2 字节的偏移量。也就是说,图像第二行的第一个字节最终是字节#20,而不是字节#18(从0开始)。此外,如果我在 LockBits 调用后立即设置断点,我可以看到 bmpData 的“步幅”属性等于 20...即使宽度明确设置为 18。而且,如果我手动将步幅设置为18、LockBits后,对返回的位图没有影响。为什么会这样?请帮忙,谢谢。
c# - LockBits/UnlockBits 在 C# 中有什么作用?
我在 c# 中有一个方法,它唯一做的是 LockBits,然后是 UnlockBits,并且图像(输入/输出,转换为字节数组)是不同的。来自输出的字节比来自输入的字节少 100 个字节。这只发生在 .jpg 文件中。检查 HxD 中的文件后,我了解到它删除了标题的一部分,确切地说是 exif 签名。但我不知道如何以及为什么。
有人知道这是在做什么吗?
这是代码: