Bitmap调用LockBits[C#]

海康SDK图像采集避坑手册:如何高效转换IntPtr为Bitmap并保存为JPG 本文深入探讨了在C#中使用海康威视SDK进行图像采集时,如何高效、稳定地将IntPtr转换为Bitmap并保存为JPG。文章对比了多种转换方法的性能与安全性,重点推荐使用LockBits与指针操作来避免内存泄漏和GC压力,并提供了多线程环境下的内存管理、异常处理及完整实战示例,帮助开发者构建鲁棒的工业视觉系统。 阅读详情
//#define ADDRESS_MODE

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace BitmapDemo
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void LockUnlockBitsExample(PaintEventArgs e)
        {

            // Create a new bitmap.
            Bitmap bmp = new Bitmap("c:\\fakePhoto.jpg");
            
            // Lock the bitmap's bits.  
            int x = 30;
            int y = 40;
            Rectangle rect = new Rectangle(x, y, bmp.Width-2*x, bmp.Height-2*y);
            System.Drawing.Imaging.BitmapData bmpData =
                bmp.LockBits(rect, System.Drawing.Imaging.ImageLockMode.ReadWrite,
                bmp.PixelFormat);

            // Get the address of the first line.

#if ADDRESS_MODE

            unsafe
            {
                byte* ptr = (byte*)bmpData.Scan0;

                int row = 0;
                int col = 0;

                //ptr[row * bmpData.Stride + col * 3 + 2] = 0xff;

                for (row = 0; row < rect.Height; ++row)
                {
                    for (col = 0; col < rect.Width; ++col)
                    {
                        ptr[row * bmpData.Stride  + col * 3 + 2] = 0xff;
                    }
                }
                
                //for (int c = 0; c < rect.Width; ++c )
                //{
                //    ptr[(row + 1) * bmpData.Stride + c * 3 + 2] = 0xff;
                //}
            }

#else
            IntPtr ptr = bmpData.Scan0;

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

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

            // Set every third value to 255. A 24bpp bitmap will look red.  
            for (int counter = 2; counter < rgbValues.Length; counter += 3)
                rgbValues[counter] = 255;

            // Copy the RGB values back to the bitmap
            System.Runtime.InteropServices.Marshal.Copy(rgbValues, 0, ptr, bytes);
#endif

            // Unlock the bits.
            bmp.UnlockBits(bmpData);
            
            // Draw the modified image.
            //e.Graphics.DrawImage(bmp, 0, 150);
            e.Graphics.DrawImage(bmp, 0, 0, bmp.Width, bmp.Height);
        }

        private void Form1_Paint(object sender, PaintEventArgs e)
        {
            LockUnlockBitsExample(e);
        }
    }
}

总结

Bitmap对象是对GDI+的.NET封装。

(byte*)bmpData.Scan0为锁定区域首字节的地址,bmpData.Stride为扫描宽度。

锁定区域的内存是一块连续存储空间,其大小为Math.Abs(bmpData.Stride) * bmpData.Height。

unsafe private void buttonTest_Click(object sender, EventArgs e)
        {
            Bitmap bitmap = new Bitmap("demo.bmp");
            this.pictureBoxLeft.Image = bitmap;

            IntPtr p = Marshal.AllocHGlobal(300 * 500 * 4);
            UInt32* pUInt32 = (UInt32*)p;

            for (int i = 0; i < 300 * 500; ++i)
                *(pUInt32 + i) = 0xffff0000;

            BitmapData bitmapData = new BitmapData();
            bitmapData.Width = 500;
            bitmapData.Height = 300;
            bitmapData.Stride = 4 * bitmapData.Width;
            bitmapData.PixelFormat = PixelFormat.Format32bppArgb;
            bitmapData.Scan0 = p;

            // Lock a 50x30 rectangular portion of the bitmap for writing.
            Rectangle rect = new Rectangle(20, 10, 500, 300);

            BitmapData bmpData = bitmap.LockBits(
               rect,
               ImageLockMode.WriteOnly | ImageLockMode.UserInputBuffer,
               PixelFormat.Format32bppArgb,
               bitmapData);

            // Commit the changes and unlock the 50x30 portion of the bitmap.  
            bitmap.UnlockBits(bmpData);

            this.pictureBoxRight.Image = bitmap;

            Marshal.FreeHGlobal(p);
            p = IntPtr.Zero;
        }


------------------------------------------------------------------------------------

https://msdn.microsoft.com/en-us/library/windows/desktop/ms536298(v=vs.85).aspx

The Bitmap::LockBits method locks a rectangular portion of this bitmap and provides a temporary buffer that you can use to read or write pixel data in a specified format. Any pixel data that you write to the buffer is copied to theBitmap object when you call Bitmap::UnlockBits.

------------------------------------------------------------------------------------


资料

http://timothyqiu.com/archives/lockbits-in-gdiplus/

http://msdn.microsoft.com/en-us/library/windows/desktop/ms536298(v=vs.85).aspx

使用lockbits方法处理图像

http://blog.sina.com.cn/s/blog_4e3e2ce4010009on.html

GDI/GDI+(1): 将Bitmap导出为Byte[]

http://blog.youkuaiyun.com/oldmtn/article/details/22277089

C# 图像类Bitmap C# 图像类Bitmap   C#中处理图像的类是Bitmap,这个类里边各种图像的信息存在类的头结构体里边,而图像的像素数据则存在一块连续的区域内,指向该区域的指针是Scano,比如一个图像的定义是: Bitmap disp=xxxxx 此时获得数据像素区块的首地址这样获得: BitmapData bmp = disp.LockBits(new Rectangle(0,0, im 阅读详情

相关推荐

akshare 布林通道策略

import datetime import pandas as pd import backtrader as bt import matplotlib.pyplot as plt from datetime import datetime import matplotlib import akshare as ak %matplotlib inline class Boll_strategy(bt.Strategy): #自定义参数,每次买入1800手 params=(('size'.

qq_26742269的博客 5340

C#中的图像处理(附带生成马赛克范例)

C#中可以利用非安全指针对位图进行处理,下面利用MSDN的一个例子进行讲解:Bitmap bmp = new Bitmap("c://fakePhoto.jpg");//读取本地图像Rectangle rect = new Rectangle(0, 0, bmp.Width, bmp.Height);System.Drawing.Imaging.BitmapData bmpData

站在巨人的肩膀上 3105

OpenMV模块视觉测距(避障)+颜色识别+TFT-LCD显示(实现原理与代码分析)

上图所示代码实际运行的帧率比较低,主要原因有以下两个:1.硬件问题,博主使用的版本比较低,可以尝试使用高版本OpenMV2.图像滤波问题。之前加入图像滤波是想提高色块识别的准确性,但是相应的运算速度也会下降。

ediykk的博客 1万+

C#使用Bitmap.lockBits注意问题

C#中使用Bitmap.lockBits可以直接将bitmap中的托管内存直接转为非托管内存。但是使用Bitmap.lockBits会存在自动字节对齐问题,将bitmap中的图像的每行数据按4字节对齐,不足的补齐。在把此非托管内存传入到第三方算法库中后,第三方仍按照原本图像宽,高解析,就会使解析出来的图片存在畸变,因此为保证第三方解析图片无误,应该在传入前将多出的对齐字节去除,然后传入。 示例代码: 问题代码: Bitamp chassis; Rectan...

dxinbin的博客 2208

基于ResNet-50的猫狗分类训练

基于ResNet-50的猫狗分类python训练

weixin_46352497的博客 1004

物理与工程中的‘黑话’:Kronecker delta和Levi-Civita符号到底简化了什么?

本文深入解析了物理与工程中常用的Kronecker delta和Levi-Civita符号的简化作用。通过对比传统表示与张量表示,展示了这些符号在向量运算、矩阵迹计算及流体力学模拟中的高效应用,显著提升计算效率和代码可读性。特别适合理论物理和工程数学领域的学习者与从业者。

weixin_27215403的博客 399

C#的Bitmap.LockBits 使用说明

本文由机器翻译。若要查看英语原文,请勾选“英语”复选框。 也可将鼠标指针移到文本上,在弹出窗口中显示英语原文。 翻译 英语 Bitmap.LockBits 方法 (Rectangle, ImageLockMode, PixelFormat) .NET Framework (current version) 其他版本

无敌三脚猫的专栏 1万+

C#利用lockbits方法快速对Bitmap进行读写

实例: 关于Bitmap处理的一个方法展示 使用SetPixel的方法 private void BitmapSetGradient(ref Bitmap bitmap) { int nx, ny; double r, g, b; nx = bitmap.Width; ny = bitm...

122&&113的博客 4393

LLaMA Factory多卡微调的实战教程(持续更新)

本文主要介绍了LLaMA Factory多卡微调的实战教程(持续更新),希望对学习大语言模型的同学们有所帮助。 文章目录 1. 前言 2. 配置环境 2.1 安装虚拟环境 2.2 安装依赖库 2.3 模型选型与下载 2.4 配置多卡环境 3. 运行代码 3.1 构建训练数据 3.2 修改配置文件 3.3 微调 3.3.1 zero3微调 3.3.2 启动API 3.3.3 模型测试

herosunly的博客 25万+

蓝牙协议栈详解(3)——BTstack

BTstack是一个轻量级蓝牙协议栈,支持经典蓝牙(BR/EDR)和低功耗蓝牙(BLE)。它采用事件驱动模型,可运行在MCU/CPU上,通过HCI接口与蓝牙控制器通信。协议栈包含完整的蓝牙协议层支持,如L2CAP、RFCOMM、ATT/GATT等,并提供丰富的示例代码。 主要特点包括模块化设计、开源授权、支持多种HCI传输方式(UART/USB)和操作系统适配。开发时需要关注事件驱动编程模型、内存配置优化、HCI传输稳定性等问题。典型应用场景包括SPP串口通信、BLE外设开发等。 使用建议从最小示例开始,逐

嵌入式软硬件叶玄 293

17.3.2.1 Bitmap.LockBits方法和Bitmap.UnlockBits方法

采用的数据格式会影响我们对图像数据的处理,通常情况下,常使用PixelFormat.Format24bppRgb,本书中也以此格式举例。Format32bppArgb:指定格式为每像素32位;Alpha、红色、绿色和蓝色分量各使用8位。Format24bppRgb:指定格式为每像素24位;红色、绿色和蓝色分量各使用 8 位。学习更多C#知识,请参看。

学习微软 .net 技术开发 1143

使用verilog设计实现QR分解

QR(正交三角)分解法是求一般矩阵全部特征值的最有效并广泛应用的方法,一般矩阵先经过正交相似变化成为Hessenberg矩阵,然后再应用QR方法求特征值和特征向量。 使用verilog对QR实现方法进行设计并进行功能仿真: 如下: 顶层模块代码: module TOP( H1R, H1I, H2R, H2I, H3R, H3I, H4R, H4I, clk, rst_n, Y1R, Y1I, Y2R, Y2I, X1R, X1I, X2R, X2I ); parameter width = 16; // I

QQ_778132974的博客 2150

C# 进行图像处理的几种方法(Bitmap,BitmapData,IntPtr)

C# 进行图像处理的几种方法(Bitmap,BitmapData,IntPtr)

wangnaisheng的专栏 1万+

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

C#中使用lockbits方法处理图像

使用lockbits方法处理图像 许多图像处理任务即时是最简单的文件类型转换,例如从32位深度到8位深度的格式转化,直接获得像素阵列要比使用GetPixel和SetPixel等方法的效率高得多。 你可能会发现DotNet采用托管机制,大多数情况下微软会推荐你使用托管代码,理由是便捷和安全。实际应用中,直接操作内存中的数据块是很少见的,尽管如此,图像处理恰恰是这类为数不多的情况之一,因为使用托管代码的效率低的难以忍受,特别是对巨幅图像来说,在此,我们讨论一下一种新的方法。 如何...

qq_23018459的博客 2580

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

C#的Bitmap

C#的Bitmap

Major_S的博客 1万+

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

C#中Bitmap类型内存占用的一些测试与分析

c#中的Bitmap类型是很重要的类型,常常感到困惑,自己本次做了一些查询与测试,总结如下: 一、主要情况说明 (一)Bitmap类 该类是CLR管理的类型,但其图像数据存储空间是否收到CLR管理不是很清楚。不过在使用的时候,是无需手工调用Dispose来释放数据内存空间的,GC会自动释放内存控件的。当然手工调用Dispose的话,GC确实会释放其数据内存空间的,只不过内存空间是托管的还是非...

就在昨天之技术点滴 1万+

C#中的LockBits

C#中的LockBits 锁定比特流 Bitmap类使用LockBits和UnLockBits方法来将位图的数据矩阵保存在内存中、直接对它进行操作,最后用修改后的数据代替位图中的原始数据。 LockBits返回以各BitmapData的类用已描述数据在已锁定的矩阵中的位置和分布。 BitmapData类包括以下几个重要的属性: Scan0:数据矩阵在内存中的地址。 Stride:数据矩阵中的行宽,以byte为单位。可能会扩展几个Byte,后面会介绍。 PixelFormat:像素格式,这对矩阵中字节的定

Major_S的博客 1378

C#中使用lockbits方法处理图像(译文)

C#中使用lockbits方法处理图像(译文) (转载) (一) 使用lockbits方法处理图像 许多图像处理任务即时是最简单的文件类型转换,例如从32位深度到8位深度的格式转化,直接获得像素阵列要比使用GetPixel和SetPixel等方法的效率高得多。 你可能会发现DotNet采用托管机制,大多数情况下微软会推荐你使用托管代码,理由是便捷和安全。实际应...

小崔的博客 4062

C#中的bitmap类和图像像素值获取方法

一.Bitmap类 Bitmap对象封装了GDI+中的一个位图,此位图由图形图像及其属性的像素数据组成.因此Bitmap是用于处理由像素数据定义的图像的对象.该类的主要方法和属性如下: 1. GetPixel方法和SetPixel方法:获取和设置一个图像的指定像素的颜色. 2. PixelFormat属性:返回图像的像素格式. 3. Palette属性:获取和设置图像所使用的颜色调色板. 4. Height Width属性:返回图像的高度和宽度. 5.LockBits方法和UnlockBits.

最数据的专栏 9997

C#中使用Bitmap 传递图到C++

马赛克算法很简单,说白了就是把一张图片分割成若干个val * val像素的小区块(可能在边缘有零星的小块,但不影响整体算法),每个小区块的颜色都是相同的。实际应用中,直接操作内存中的数据块是很少见的,尽管如此,图像处理恰恰是这类为数不多的情况之一,因为使用托管代码的效率低的难以忍受,特别是对巨幅图像来说,在此,我们讨论一下一种新的方法。当前指针所指的字节中的每一位都表示一个像素的索引颜色,调色盘为两色,最左边的像素为8,最右边的像素为0。Stride:数据矩阵中的行宽,以byte为单位。

hllyzms的博客 1275

使用lockbits方法处理图像

许多图像处理任务即时是最简单的文件类型转换,例如从32位深度到8位深度的格式转化,直接获得像素阵列要比使用GetPixel和SetPixel等方法的效率高得多。         你可能会发现DotNet采用托管机制,大多数情况下微软会推荐你使用托管代码,理由是便捷和安全。实际应用中,直接操作内存中的数据块是很少见的,尽管如此,图像处理恰恰是这类为数不多的情况之一,因为使用托管代码的效率低的难以忍

行云流水 1634

高效实现Halcon HObject与C# Bitmap图像互转的实战指南

本文详细介绍了Halcon HObject与C# Bitmap图像互转的实战方法,涵盖灰度图和彩色图的高效转换技巧。通过代码示例和性能优化建议,帮助开发者解决机器视觉开发中的图像格式兼容性问题,提升算法与界面的协同效率。重点解析了内存管理、通道顺序处理等常见问题,适用于PCB检测、OCR预处理等工业视觉应用场景。

rl6adventurer的博客 801

C#中使用LockBits、UnlockBits

C#中使用LockBits、UnlockBits

wangnaisheng的专栏 1017

C# Halcon图像处理:告别内存泄漏!HObject与Bitmap互转的三种高效方法(附性能对比)

本文详细介绍了C# Halcon图像处理中HObject与Bitmap互转的三种高效方法,包括直接指针操作法、Marshal中介法和OpenCV中转法,并对比了它们的性能差异和适用场景。通过优化代码和预防内存泄漏策略,帮助开发者构建更稳定高效的视觉系统,特别适合工业视觉检测应用。

weixin_30897079的博客 355

【转】c#数字图像处理(一)Bitmap类、 Bitmapdata类和 Graphics类

转自:https://www.cnblogs.com/dearzhoubi/p/8553763.html Bitmap类、 Bitmapdata类和 Graphics类是C#图像处理中最重要的3个类,如果要用C# 进行图像处理,就一定要掌握它们。 1.1 Bitmap类 Bitmap对象封装了GDI+中的一个位图,此位图由图形图像及其属性的像素数据组成。 因此 Bitmap是用于处理由像素数据定义的图像的对象。 Bitmap类类的主要方法和属性如下: Get Pixel方法和 Setpiⅸel方

sinolover的专栏 3628
上一篇: 采用Win32结构化异常(SEH)捕捉所有未捕捉的异常[C++]
下一篇: C# How to
cocoasprite
博客等级 码龄14年 72粉丝 101原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值