当前位置: 首页 > news >正文

阿里云网站全部清空怎么做营销战略和营销策略

阿里云网站全部清空怎么做,营销战略和营销策略,上海建网站,网站开发在线教程文章目录1 在回调函数中实现2 独立封装调用2.1 获取图像宽、高、pBuffer、channel2.2 内存图像数据截取ROI并显示2.3 回调函数调用3 for循环嵌套 方法24 for循环嵌套 方法35 按行复制数据提高效率#xff0c;但很耗内存6 unsafe代码 解释及注意事项 看我另一篇文章7 ConvertTo… 文章目录1 在回调函数中实现2 独立封装调用2.1 获取图像宽、高、pBuffer、channel2.2 内存图像数据截取ROI并显示2.3 回调函数调用3 for循环嵌套 方法24 for循环嵌套 方法35 按行复制数据提高效率但很耗内存6 unsafe代码 解释及注意事项 看我另一篇文章7 ConvertToRGB24详细解释 、示例、注意事项 看我另一篇文章8 问题与反思8.1 被反复创建和使用需手动释放吗8.2 创建一个全局Bitmap bitma多线程访问会冲突吗当我们只要显示ROI区域的画面显示局部细节而不是相机整个画面时就需要对图像数据进行截取。对于工业相机原图像数据IFrameData 裁剪ROI并不像 OpenCV中截取ROI那么简单 下面提供3种方法实现效率不同并将ROI画面实时显示在pictureBox中 1 在回调函数中实现 public IntPtr pBuffer IntPtr.Zero;private void __OnFrameCallbackFun(object objUserParam, IFrameData objIFrameData) {int channel 0;try{if (null ! objIFrameData){//************************************************************//获取图像信息为图像处理等功能做准备//*************************************************************int imgHeight (int)objIFrameData.GetHeight();int imgWidth (int)objIFrameData.GetWidth();//************************************************************// 对图像进行裁剪并显示在 PictureBox 中//*************************************************************Rectangle ROI new Rectangle(1323, 212, 2200, 1500);//获取图像bufferGX_VALID_BIT_LIST emValidBits GX_VALID_BIT_LIST.GX_BIT_0_7;emValidBits __GetBestValudBit(objIFrameData.GetPixelFormat());// 判断图像是否成功接收if (GX_FRAME_STATUS_LIST.GX_FRAME_STATUS_SUCCESS objIFrameData.GetStatus()){// 在关键部分的代码前加锁lock (this){if (m_bIsColor){// 彩色图像pBuffer objIFrameData.ConvertToRGB24(emValidBits, GX_BAYER_CONVERT_TYPE_LIST.GX_RAW2RGB_NEIGHBOUR, false);//最后一个参数是否垂直翻转图像channel 3;}else{// 黑白图像if (__IsPixelFormat8(objIFrameData.GetPixelFormat())){pBuffer objIFrameData.GetBuffer();}else{pBuffer objIFrameData.ConvertToRaw8(emValidBits);}channel 1;}PixelFormat format new PixelFormat();format channel 3 ? PixelFormat.Format24bppRgb : PixelFormat.Format8bppIndexed;//若3通道彩色图像否则黑白图像//创建ROI 空图像Bitmap bitmap new Bitmap(ROI.Width, ROI.Height, format);BitmapData bmpData bitmap.LockBits(new Rectangle(0, 0, ROI.Width, ROI.Height), ImageLockMode.WriteOnly, bitmap.PixelFormat);int srcStride imgWidth * channel;// 原图每行数据长度int destStride bmpData.Stride;// 新图每行数据长度int srcStartX (ROI.X - 1) * channel; // ROI 起始 X 坐标在原图数据中的位置二维视角int srcStartY ROI.Y - 1; // ROI 起始 Y 坐标在原图数据中的位置二维视角int srcOffset srcStartY * srcStride srcStartX; // ROI 起始位置在原图数据中的偏移量(原图数据在内存中是一行一维数组)unsafe{byte* srcPtr (byte*)pBuffer srcOffset;byte* destPtr (byte*)bmpData.Scan0;for (int y 0; y ROI.Height; y){for (int x 0; x ROI.Width * channel; x){destPtr[x] srcPtr[x];}srcPtr srcStride;destPtr destStride;}}bitmap.UnlockBits(bmpData);// 在这里处理 bitmap 图像,下面是显示举例m_bitmap bitmap;//将其赋值给全局的m_bitmap从而可以在外部调用ShowProcessedImage(m_nOperateID, bitmap);//传给函数进行处理显示//pictureBox1.Image bitmap;//传给pictureBox1直接显示}}}m_objCFps.IncreaseFrameNum();}catch (Exception ex){MessageBox.Show(ex.Message);} } 2 独立封装调用 2.1 获取图像宽、高、pBuffer、channel private void getImgInfo(IFrameData objIFrameData, ref IntPtr pBuffer){try{if (null ! objIFrameData){//获取图像宽高SrcImgHeight (int)objIFrameData.GetHeight();SrcImgWidth (int)objIFrameData.GetWidth();//获取图像bufferGX_VALID_BIT_LIST emValidBits GX_VALID_BIT_LIST.GX_BIT_0_7;emValidBits __GetBestValudBit(objIFrameData.GetPixelFormat());// 判断图像是否成功接收if (GX_FRAME_STATUS_LIST.GX_FRAME_STATUS_SUCCESS objIFrameData.GetStatus()){// 在关键部分的代码前加锁lock (this){if (colorFlag){// 彩色图像pBuffer objIFrameData.ConvertToRGB24(emValidBits, GX_BAYER_CONVERT_TYPE_LIST.GX_RAW2RGB_NEIGHBOUR, false);//最后一个参数是否垂直翻转图像true则翻转channel 3;}else{// 黑白图像if (__IsPixelFormat8(objIFrameData.GetPixelFormat())){pBuffer objIFrameData.GetBuffer();}else{pBuffer objIFrameData.ConvertToRaw8(emValidBits);}channel 1;}}}}}catch (Exception ex){MessageBox.Show(ex.Message);}} 2.2 内存图像数据截取ROI并显示 private void getRoiBmpData(Rectangle ROI, IntPtr pBuffer, ref Bitmap ROI_bitmap){try{if (null ! pBuffer){ //判断像素格式PixelFormat format new PixelFormat();// format channels 3 ? PixelFormat.Format24bppRgb : PixelFormat.Format8bppIndexed;//若3通道彩色图像否则黑白图像switch (channel){case 1:format PixelFormat.Format8bppIndexed;break;case 3:format PixelFormat.Format24bppRgb;break;case 4:format PixelFormat.Format32bppArgb;break;}// 在关键部分的代码前加锁lock (this){//创建ROI 空图像Bitmap bitmap new Bitmap(ROI.Width, ROI.Height, format);BitmapData bmpData bitmap.LockBits(new Rectangle(0, 0, ROI.Width, ROI.Height), ImageLockMode.WriteOnly, bitmap.PixelFormat);int srcStride SrcImgWidth * channel;// 原图每行数据长度int destStride bmpData.Stride;// 新图每行数据长度int srcStartX (ROI.X - 1) * channel; // ROI 起始 X 坐标在原图数据中的位置二维视角int srcStartY ROI.Y - 1; // ROI 起始 Y 坐标在原图数据中的位置二维视角int srcOffset srcStartY * srcStride srcStartX; // ROI 起始位置在原图数据中的偏移量(原图数据在内存中是一行一维数组)unsafe{byte* srcPtr (byte*)pBuffer srcOffset;byte* destPtr (byte*)bmpData.Scan0;for (int y 0; y ROI.Height; y){for (int x 0; x ROI.Width * channel; x){destPtr[x] srcPtr[x];}srcPtr srcStride;destPtr destStride;}}bitmap.UnlockBits(bmpData);// 在这里处理 bitmap 图像//ShowProcessedImage(m_nOperateID, bitmap);ROI_bitmap bitmap;}}}catch (Exception ex){MessageBox.Show(ex.Message);}} 2.3 回调函数调用 public static int SrcImgHeight, SrcImgWidth;int channel 0;bool isShowSrcImg true;bool camImg_isProcess false; //是否图像处理,不执行图像处理的时候默认开启预览模式。bool isPreviewRoiImg false; //是否图像处理,不执行图像处理的时候默认开启预览模式。Rectangle ROI new Rectangle(1323, 212, 2200, 1500);Bitmap bitmapB6; 代码中未出现的变量为 全局变量,或者库中的变量 private void __OnFrameCallbackFun_1(object objUserParam, IFrameData objIFrameData){try{if (isShowSrcImg) //当开始处理图像时原视频要暂停否则buffer中的数据会变化图像上下颠倒交替出现(因Show(objIFrameData)中显示实现对图像数据做了垂直翻转){//************************************************************//显示相机获取的原图//************************************************************ m_objGxBitmap1.Show(objIFrameData);}//获取图像宽、高、pBuffer、channel等信息getImgInfo2(objIFrameData, ref pBuffer1);//************************************************************// 对图像进行裁剪并显示在 PictureBox 中//*************************************************************if (isPreviewRoiImg)// 开启预览模式。{getRoiBmpData2(ROI, pBuffer1, ref bitmapB6);//ImageShow1.Image bitmapB6;}//统计帧率m_objCFps1.IncreaseFrameNum();}catch (Exception ex){MessageBox.Show(回调函数2 ex.Message);}} 3 for循环嵌套 方法2 private void __OnFrameCallbackFun(object objUserParam, IFrameData objIFrameData){try{if (null ! objIFrameData){// 获取图像信息int srcImgWidth (int)objIFrameData.GetWidth();int srcImgHeight (int)objIFrameData.GetHeight();GX_VALID_BIT_LIST emValidBits GX_VALID_BIT_LIST.GX_BIT_0_7;emValidBits __GetBestValudBit(objIFrameData.GetPixelFormat());// 判断图像是否成功接收if (GX_FRAME_STATUS_LIST.GX_FRAME_STATUS_SUCCESS objIFrameData.GetStatus()){// 在关键部分的代码前加锁lock (this){IntPtr pBuffer IntPtr.Zero;if (m_bIsColor){// 彩色图像pBuffer objIFrameData.ConvertToRGB24(emValidBits, GX_BAYER_CONVERT_TYPE_LIST.GX_RAW2RGB_NEIGHBOUR, false);}else{// 黑白图像if (__IsPixelFormat8(objIFrameData.GetPixelFormat())){pBuffer objIFrameData.GetBuffer();}else{pBuffer objIFrameData.ConvertToRaw8(emValidBits);}}// 创建ROI BitmapBitmap bitmap new Bitmap(ROI.Width, ROI.Height, PixelFormat.Format24bppRgb);BitmapData bmpData bitmap.LockBits(new Rectangle(0, 0, ROI.Width, ROI.Height), ImageLockMode.WriteOnly, bitmap.PixelFormat);// 计算每行字节数int stride bmpData.Stride;int bytes Math.Abs(stride) * bitmap.Height;// 创建一个 byte 数组来存储图像数据byte[] imageData new byte[bytes];// 计算ROI在原始图像中的偏移位置int roiOffsetX ROI.X;int roiOffsetY ROI.Y;// 将 pBuffer 中的图像数据复制到数组中考虑ROI在原始图像中的偏移位置for (int y 0; y ROI.Height; y){int srcY roiOffsetY y;int srcIndex srcY * srcImgWidth * 3; // 假设是24位RGB图像for (int x 0; x ROI.Width; x){int srcX roiOffsetX x;int dstIndex (y * ROI.Width x) * 3;imageData[dstIndex] Marshal.ReadByte(pBuffer, srcIndex srcX * 3);imageData[dstIndex 1] Marshal.ReadByte(pBuffer, srcIndex srcX * 3 1);imageData[dstIndex 2] Marshal.ReadByte(pBuffer, srcIndex srcX * 3 2);}}// 复制图像数据到 Bitmap 中Marshal.Copy(imageData, 0, bmpData.Scan0, bytes);bitmap.UnlockBits(bmpData);// 显示图像ShowProcessedImage(m_nOperateID, bitmap);}}}m_objCFps.IncreaseFrameNum();}catch (Exception ex){MessageBox.Show(ex.Message);}} 4 for循环嵌套 方法3 private void __OnFrameCallbackFun(object objUserParam, IFrameData objIFrameData){try{if (null ! objIFrameData){// 获取图像信息SrcImgWidth (int)objIFrameData.GetWidth();SrcImgHeight (int)objIFrameData.GetHeight();GX_VALID_BIT_LIST emValidBits GX_VALID_BIT_LIST.GX_BIT_0_7;emValidBits __GetBestValudBit(objIFrameData.GetPixelFormat());PixelFormat format;// 判断图像是否成功接收if (GX_FRAME_STATUS_LIST.GX_FRAME_STATUS_SUCCESS objIFrameData.GetStatus()){// 在关键部分的代码前加锁lock (this){IntPtr pBuffer IntPtr.Zero;int channel;if (m_bIsColor){// 彩色图像pBuffer objIFrameData.ConvertToRGB24(emValidBits, GX_BAYER_CONVERT_TYPE_LIST.GX_RAW2RGB_NEIGHBOUR, false); // 最后一个参数是否垂直翻转图像true则翻转channel 3;}else{// 黑白图像if (__IsPixelFormat8(objIFrameData.GetPixelFormat())){pBuffer objIFrameData.GetBuffer();}else{pBuffer objIFrameData.ConvertToRaw8(emValidBits);}channel 1;}// 判断像素格式format channel 3 ? PixelFormat.Format24bppRgb : PixelFormat.Format8bppIndexed;// 创建ROI 空图像m_bitmap new Bitmap(ROI.Width, ROI.Height, format);BitmapData bmpData m_bitmap.LockBits(new Rectangle(0, 0, ROI.Width, ROI.Height), ImageLockMode.WriteOnly, m_bitmap.PixelFormat);int srcStride SrcImgWidth * channel; // 原图每行数据长度int destStride bmpData.Stride; // 新图每行数据长度int srcStartX (ROI.X - 1) * channel; // ROI 起始 X 坐标在原图数据中的位置二维视角int srcStartY ROI.Y - 1; // ROI 起始 Y 坐标在原图数据中的位置二维视角int srcOffset srcStartY * srcStride srcStartX; // ROI 起始位置在原图数据中的偏移量(原图数据在内存中是一行一维数组)// 将 pBuffer 中的图像数据复制到数组中考虑ROI在原始图像中的偏移位置for (int y 0; y ROI.Height; y){int srcY srcStartY y;int srcIndex srcOffset srcY * srcStride;for (int x 0; x ROI.Width * channel; x){int srcX srcStartX x;int dstIndex y * destStride x;// 复制像素数据Marshal.WriteByte(bmpData.Scan0, dstIndex, Marshal.ReadByte(pBuffer, srcIndex x));}}m_bitmap.UnlockBits(bmpData);// 显示图像ShowProcessedImage(m_nOperateID, m_bitmap);}}m_objCFps.IncreaseFrameNum();}}catch (Exception ex){MessageBox.Show(ex.Message);}} 5 按行复制数据提高效率但很耗内存 private unsafe void __OnFrameCallbackFun111(object objUserParam, IFrameData objIFrameData){try{if (null ! objIFrameData){// 获取图像信息SrcImgWidth (int)objIFrameData.GetWidth();SrcImgHeight (int)objIFrameData.GetHeight();GX_VALID_BIT_LIST emValidBits GX_VALID_BIT_LIST.GX_BIT_0_7;emValidBits __GetBestValudBit(objIFrameData.GetPixelFormat());PixelFormat format;// 判断图像是否成功接收if (GX_FRAME_STATUS_LIST.GX_FRAME_STATUS_SUCCESS objIFrameData.GetStatus()){// 在关键部分的代码前加锁lock (this){if (m_bIsColor){// 彩色图像pBuffer objIFrameData.ConvertToRGB24(emValidBits, GX_BAYER_CONVERT_TYPE_LIST.GX_RAW2RGB_NEIGHBOUR, false); // 最后一个参数是否垂直翻转图像true则翻转channel 3;}else{// 黑白图像if (__IsPixelFormat8(objIFrameData.GetPixelFormat())){pBuffer objIFrameData.GetBuffer();}else{pBuffer objIFrameData.ConvertToRaw8(emValidBits);}channel 1;}// 判断像素格式format channel 3 ? PixelFormat.Format24bppRgb : PixelFormat.Format8bppIndexed;// 创建ROI 空图像m_bitmap new Bitmap(ROI.Width, ROI.Height, format);BitmapData bmpData m_bitmap.LockBits(new Rectangle(0, 0, ROI.Width, ROI.Height), ImageLockMode.WriteOnly, m_bitmap.PixelFormat);int srcStride SrcImgWidth * channel; // 原图每行数据长度 int destStride bmpData.Stride;// 新图每行数据长度int srcStartX (ROI.X - 1) * channel; // ROI 起始 X 坐标在原图数据中的位置二维视角 int srcStartY ROI.Y - 1; // ROI 起始 Y 坐标在原图数据中的位置二维视角// ROI 起始位置在原图数据中的偏移量(原图数据在内存中是一行一维数组)int srcOffset srcStartY * srcStride srcStartX;unsafe{// 计算 ROI 区域总字节数//int bytes Math.Abs(destStride) * m_bitmap.Height;byte* bmpPtr (byte*)bmpData.Scan0; // 指向 ROI Bitmap 的扫描行指针 byte* srcPtr (byte*)pBuffer srcOffset; // 指向原始图像数据的指针 for (int y 0; y ROI.Height; y) // 逐行复制ROI区域的图像数据{// 复制当前行的图像数据到ROI Bitmap中//从源地址 srcPtr开始每次复制destStride个字节一整行的数据到目标地址 bmpPtr 处第四个参数偏移量Buffer.MemoryCopy(srcPtr, bmpPtr, destStride, destStride);bmpPtr destStride;srcPtr srcStride;}}m_bitmap.UnlockBits(bmpData);// 显示图像ShowProcessedImage(m_nOperateID, m_bitmap);}}m_objCFps.IncreaseFrameNum();}}catch (Exception ex){MessageBox.Show(ex.Message);}} 6 unsafe代码 解释及注意事项 看我另一篇文章 7 ConvertToRGB24详细解释 、示例、注意事项 看我另一篇文章 8 问题与反思 C# 自定义函数getRoiBmpData该函数功能“对相机获取到的 IFrameData 转换为pBuffer 然后进行ROI裁剪操作将ROI图像bitmap传给ShowProcessedImage函数进行处理”。getRoiBmpData函数被5个回调函数同时调用因为有5个相机每个相机调用一个回调函数。那么我为什么5个相机要用5个回调呢因为这样每个回调函数只负责一个相机这样看起来分工更明确。 现在有两个问题 问题1.这行代码“ Bitmap bitmap new Bitmap(ROI.Width, ROI.Height, format);”中bitmap 被反复创建和使用在该函数中需要手动释放吗 问题2.这行代码“ Bitmap bitmap new Bitmap(ROI.Width, ROI.Height, format);”中bitmap 被反复创建和使用那么我可以创建一个全局变量Bitmap bitmap 这样就不用每次进入函数都会创建一次bitmap 但是呢我担心5个回调函数共享这一个bitmap 会冲突吗当然ShowProcessedImage函数和getRoiBmpData函数也只有一个都是同时被5个回调函数调用的。 8.1 被反复创建和使用需手动释放吗 在这段代码中虽然 bitmap 被反复创建和使用但在每次使用后都被正确地释放了。这是因为在使用完毕后调用了 bitmap.UnlockBits(bmpData); 来释放 BitmapData 对象。所以不需要手动释放 bitmap因为在 bitmap 超出范围时会被自动回收。 bitmap 对象是在函数内部创建的它会在函数执行完毕后自动离开作用域从而被垃圾回收机制回收。因为它的生命周期受到函数作用域的限制一旦函数执行完毕就会被销毁。 8.2 创建一个全局Bitmap bitma多线程访问会冲突吗 问题2创建一个全局变量 Bitmap bitmap 是一种有效的方法可以避免在每次函数调用时都重新创建 bitmap 对象。然而如果多个回调函数同时访问和修改同一个全局 bitmap 对象就可能会发生竞态条件或数据竞争导致程序行为不确定或产生错误。因此你需要确保在对 bitmap 进行读写操作时进行适当的线程同步以避免冲突。 为了解决这个问题可以采取以下方法之一 在访问全局 bitmap 对象时使用线程同步机制如锁以确保在任何时候只有一个回调函数可以访问或修改 bitmap 对象。这样可以避免并发访问导致的问题。一个简单的方法是在访问 bitmap 之前使用 lock 关键字来确保线程安全就像你在代码中对关键部分加锁一样。这样可以确保每次只有一个线程能够访问 bitmap从而避免并发冲突。 将 bitmap 对象作为函数参数传递给每个回调函数这样每个函数都有自己的 bitmap 对象实例不会相互干扰。 选择哪种方法取决于你的具体需求和代码结构。如果需要在多个回调函数之间共享相同的 bitmap 对象并且需要确保线程安全则使用第一种方法如果每个回调函数都需要独立的 bitmap 对象则使用第二种方法。
http://www.pierceye.com/news/1615/

相关文章:

  • 浅灰色做网站背景黄骅市15天天气预报
  • 保定企业建站系统模板长治网站制作哪家好
  • 淘宝客个人网站建设公众号怎么进入
  • zhon中国建设会计学会网站网站备案都审核什么资料
  • 手机电脑网站 建站程序网站title怎么写
  • 发展速度迅猛 具有丰富的网站建设经验淄博网站制作定制技术
  • 合肥网站制作开发上海集团网站建设公司
  • 网站建设公司推广广告语网站建设叁金手指花总9
  • 网站建设 长安镇建网站的详细技术
  • 在电脑上做网站的软件揭阳网站制作找哪家
  • 工装设计案例网站iosapp开发用什么语言
  • 单位网站建设情况zhihu网站建设
  • 做网站用哪个软件写比较好招牌设计创意门头
  • 做网站的原理免费商城
  • 新郑网站优化买正品东西哪个网最好
  • 能在线做初中题的网站建站 报价
  • 济南网站建设 选搜点o英语网站建设
  • 免费的设计网站有哪些电视墙装修效果图2023新款
  • 京东网站开发技术如何把自己的网站推广
  • 免费网站下载直播软件大全一流高职院校建设专题网站
  • 微信公众号微网站建设苏州保洁公司哪家比较好
  • 塘沽做网站的公司营销型网站服务
  • 网站建设服务代理赣州做网站哪家好
  • cms二次开发网站建设怎么注册网站 个人
  • 郑州网站开发hndlwx江门高端网站建设
  • 企业网站更新什么内容做网站怎么跑业务
  • 网站上线前准备方案网站制作和推广lv官网
  • 廊坊建设网站的公司上海网站建设免
  • 网站服务器基本要素seo搜索优化服务
  • 绿色为主色的网站专业团队口号