如何高效多点取色,一定要高效的,知道的朋友告诉我一下啊

问题描述

大概取500个点的颜色,总共用时最好是几毫秒,不然获取到的这500个点不是同一时间点的颜色了,如果把图片先存进内存在读的话,也很耗时哪位朋友有办法可以几毫秒读取500个点的颜色吗?

解决方案

解决方案二:
500个点要几毫秒??这种内存操作都是ns级别的图片放进内存很耗时??拜托你先测试了再说,不要靠猜想
解决方案三:
引用1楼Z65443344的回复:

500个点要几毫秒??这种内存操作都是ns级别的图片放进内存很耗时??拜托你先测试了再说,不要靠猜想

写个演示代码呗
解决方案四:
别调用系统的GetPixel方法,MSDN上微软已经给了高效率的方法,自己封装个类即可,能快1000倍classFastBitmap:IDisposable{#region成员变量Bitmapbitmap;BitmapDatabitmapData;#endregion#region属性publicBitmapBitmap{get{returnbitmap;}}#endregion#region构造函数publicFastBitmap(Bitmapbitmap){this.bitmap=bitmap;this.bitmapData=bitmap.LockBits(newRectangle(0,0,bitmap.Width,bitmap.Height),System.Drawing.Imaging.ImageLockMode.ReadWrite,bitmap.PixelFormat);}#endregion#region方法publicunsafeColorGetPixel(intx,inty){if(bitmapData.PixelFormat==PixelFormat.Format32bppRgb||bitmapData.PixelFormat==PixelFormat.Format32bppArgb){byte*numPtr=(byte*)((int)bitmapData.Scan0+y*bitmapData.Stride+x*4);returnColor.FromArgb(numPtr[3],numPtr[2],numPtr[1],numPtr[0]);}if(bitmapData.PixelFormat==PixelFormat.Format24bppRgb){byte*numPtr2=(byte*)((int)bitmapData.Scan0+y*bitmapData.Stride+x*3);returnColor.FromArgb(numPtr2[2],numPtr2[1],numPtr2[0]);}returnColor.Empty;}protectedvoidUnlock(){if(this.bitmapData!=null){this.bitmap.UnlockBits(this.bitmapData);this.bitmapData=null;}}#endregionpublicvoidDispose(){GC.SuppressFinalize(this);this.Dispose(true);}protectedvirtualvoidDispose(booldisposing){this.Unlock();if(disposing){this.bitmap.Dispose();}}}

解决方案五:
直接构造你需要取点的单位矩阵,然后直接Matrix.TransformVectors进行矩阵乘,就可以得到信息ps:如果信息吞吐大,一般采用队列缓存,然后慢慢处理(现在可以用RX做,方便不少)
解决方案六:
引用3楼bigbaldy的回复:

别调用系统的GetPixel方法,MSDN上微软已经给了高效率的方法,自己封装个类即可,能快1000倍classFastBitmap:IDisposable{#region成员变量Bitmapbitmap;BitmapDatabitmapData;#endregion#region属性publicBitmapBitmap{get{returnbitmap;}}#endregion#region构造函数publicFastBitmap(Bitmapbitmap){this.bitmap=bitmap;this.bitmapData=bitmap.LockBits(newRectangle(0,0,bitmap.Width,bitmap.Height),System.Drawing.Imaging.ImageLockMode.ReadWrite,bitmap.PixelFormat);}#endregion#region方法publicunsafeColorGetPixel(intx,inty){if(bitmapData.PixelFormat==PixelFormat.Format32bppRgb||bitmapData.PixelFormat==PixelFormat.Format32bppArgb){byte*numPtr=(byte*)((int)bitmapData.Scan0+y*bitmapData.Stride+x*4);returnColor.FromArgb(numPtr[3],numPtr[2],numPtr[1],numPtr[0]);}if(bitmapData.PixelFormat==PixelFormat.Format24bppRgb){byte*numPtr2=(byte*)((int)bitmapData.Scan0+y*bitmapData.Stride+x*3);returnColor.FromArgb(numPtr2[2],numPtr2[1],numPtr2[0]);}returnColor.Empty;}protectedvoidUnlock(){if(this.bitmapData!=null){this.bitmap.UnlockBits(this.bitmapData);this.bitmapData=null;}}#endregionpublicvoidDispose(){GC.SuppressFinalize(this);this.Dispose(true);}protectedvirtualvoidDispose(booldisposing){this.Unlock();if(disposing){this.bitmap.Dispose();}}}

引用3楼bigbaldy的回复:

别调用系统的GetPixel方法,MSDN上微软已经给了高效率的方法,自己封装个类即可,能快1000倍classFastBitmap:IDisposable{#region成员变量Bitmapbitmap;BitmapDatabitmapData;#endregion#region属性publicBitmapBitmap{get{returnbitmap;}}#endregion#region构造函数publicFastBitmap(Bitmapbitmap){this.bitmap=bitmap;this.bitmapData=bitmap.LockBits(newRectangle(0,0,bitmap.Width,bitmap.Height),System.Drawing.Imaging.ImageLockMode.ReadWrite,bitmap.PixelFormat);}#endregion#region方法publicunsafeColorGetPixel(intx,inty){if(bitmapData.PixelFormat==PixelFormat.Format32bppRgb||bitmapData.PixelFormat==PixelFormat.Format32bppArgb){byte*numPtr=(byte*)((int)bitmapData.Scan0+y*bitmapData.Stride+x*4);returnColor.FromArgb(numPtr[3],numPtr[2],numPtr[1],numPtr[0]);}if(bitmapData.PixelFormat==PixelFormat.Format24bppRgb){byte*numPtr2=(byte*)((int)bitmapData.Scan0+y*bitmapData.Stride+x*3);returnColor.FromArgb(numPtr2[2],numPtr2[1],numPtr2[0]);}returnColor.Empty;}protectedvoidUnlock(){if(this.bitmapData!=null){this.bitmap.UnlockBits(this.bitmapData);this.bitmapData=null;}}#endregionpublicvoidDispose(){GC.SuppressFinalize(this);this.Dispose(true);}protectedvirtualvoidDispose(booldisposing){this.Unlock();if(disposing){this.bitmap.Dispose();}}}

我把这些代码写进了dll里,然后import这个dll,现在怎么取某一点的颜色啊?
解决方案七:
引用5楼rbbcnm的回复:

我把这些代码写进了dll里,然后import这个dll,现在怎么取某一点的颜色啊?

new一个FastBitmap,然后直接用GetPixel方法取就可以了呀
解决方案八:
引用6楼bigbaldy的回复:

Quote: 引用5楼rbbcnm的回复:
我把这些代码写进了dll里,然后import这个dll,现在怎么取某一点的颜色啊?

new一个FastBitmap,然后直接用GetPixel方法取就可以了呀

谢谢你的回答啊,许许多多谢谢如何截取某个句柄的窗口图片到内存,再在内存中读取点的颜色啊?
解决方案九:
引用7楼rbbcnm的回复:

谢谢你的回答啊,许许多多谢谢如何截取某个句柄的窗口图片到内存,再在内存中读取点的颜色啊?

句柄有了,窗体的所有信息不就都有了,根据位置、大小截图就行了,这些都是基本的东西,你可以自己先搜索一下,网上全是答案
解决方案十:
using(DSAPI.图形图像.图像识别B=newDSAPI.图形图像.图像识别(this.BackgroundImage)){for(intI=0;I<=499;I++){Console.WriteLine(B.获取指定坐标颜色(I,0).ToString);}}

解决方案十一:
引用3楼bigbaldy的回复:

别调用系统的GetPixel方法,MSDN上微软已经给了高效率的方法,自己封装个类即可,能快1000倍classFastBitmap:IDisposable{#region成员变量Bitmapbitmap;BitmapDatabitmapData;#endregion#region属性publicBitmapBitmap{get{returnbitmap;}}#endregion#region构造函数publicFastBitmap(Bitmapbitmap){this.bitmap=bitmap;this.bitmapData=bitmap.LockBits(newRectangle(0,0,bitmap.Width,bitmap.Height),System.Drawing.Imaging.ImageLockMode.ReadWrite,bitmap.PixelFormat);}#endregion#region方法publicunsafeColorGetPixel(intx,inty){if(bitmapData.PixelFormat==PixelFormat.Format32bppRgb||bitmapData.PixelFormat==PixelFormat.Format32bppArgb){byte*numPtr=(byte*)((int)bitmapData.Scan0+y*bitmapData.Stride+x*4);returnColor.FromArgb(numPtr[3],numPtr[2],numPtr[1],numPtr[0]);}if(bitmapData.PixelFormat==PixelFormat.Format24bppRgb){byte*numPtr2=(byte*)((int)bitmapData.Scan0+y*bitmapData.Stride+x*3);returnColor.FromArgb(numPtr2[2],numPtr2[1],numPtr2[0]);}returnColor.Empty;}protectedvoidUnlock(){if(this.bitmapData!=null){this.bitmap.UnlockBits(this.bitmapData);this.bitmapData=null;}}#endregionpublicvoidDispose(){GC.SuppressFinalize(this);this.Dispose(true);}protectedvirtualvoidDispose(booldisposing){this.Unlock();if(disposing){this.bitmap.Dispose();}}}

但是我在创建实例后,提示'FastBitmap'doesnotcontainaconstructorthattakes0arguments(CS1729)FastBitmaphaha=newFastBitmap();haha.GetPixel(1,1);
解决方案十二:
谁能帮帮忙啊
解决方案十三:
FastBitmaphaha=newFastBitmap();haha.GetPixel(1,1);在创建实例后,提示'FastBitmap'doesnotcontainaconstructorthattakes0arguments(CS1729)该怎么解决啊?
解决方案十四:
doesnotcontainaconstructorthattakes0arguments不包含带0个参数的构造函数他只有一个构造函数publicFastBitmap(Bitmapbitmap)你都去找高效的方法了,怎么连基本的都不会?!
解决方案十五:
引用9楼dylike的回复:

using(DSAPI.图形图像.图像识别B=newDSAPI.图形图像.图像识别(this.BackgroundImage)){for(intI=0;I<=499;I++){Console.WriteLine(B.获取指定坐标颜色(I,0).ToString);}}

不错的实例,可以参考一下

时间: 2025-01-01 23:43:59

如何高效多点取色,一定要高效的,知道的朋友告诉我一下啊的相关文章

推荐最高效的软件给最高效的人——麦库记事

作者:龙晟曦 麦库记事,是什么? 麦库,即麦库记事,是由盛大创新院推出的一款免费.永久在线.安全的云记事软件.您可以用电脑.手机等设备,随时随地在麦库里保存笔记.备忘.写文档,存资料,并可以方便的整理和分享.麦库空间永久有效. 麦库记事为用户提供的核心服务: 1.快速记录笔记.备忘:永久保存.文档空间无限大: 2.随时存取.方便管理:分类.标签2种方式协助管理: 3.快速搜索.文件批量上传:实时进度: 4.多种方式快速分享:公开文档.资源共享: (以上摘自百度百科) 对我而言,麦库是最好的资料保

高效查数组-用最高效的方法找出大数组相同的两个数

问题描述 用最高效的方法找出大数组相同的两个数 一个数组的长度有1千多万.里面有两个数字是相同的. 用最高效的方法找出这两个数. 解决方案 遍历,用位图存储,消耗空间1000W/8

抽根烟:如果高效打造论坛外链

  尽管搜索引擎对论坛外链的权重有所降低,但我们还是不得不承认,论坛外链仍然是时下站长获取外链的主要手段之一.目前,论坛外链主要有签名外链和贴内夹杂锚文本两种,2种方法各有优劣.今天,小编就将自己做论坛外链的经验分享出来,希望给大家尤其是新手朋友一点帮助. 我们知道,论坛外链形成的前提是帖子被收录.因为只有收录了的帖子,你的外链才会生效.所以,这里提到了一个高效的概念.此高效非彼高效,这里指的高效不是指用所谓的论坛发帖机.顶贴机来打造的所谓高效发帖,而是如何让你的发帖/回复被百度更多的收录.如果

android中傻瓜式建立数据库及高效数据库操作代码的编写

初学者在学android的时候,看到书上的sqlite数据库编程怎么有点复杂. 初学阶段的难点: 建立数据库表字段(field)数据类型(text,interge)选择较多,考虑较多. 在activity中数据更新插入要考虑的约束条件好多 老是访问数据库的数据,每次都要在activity中声明一个cursor并且通过一大堆代码来获取cursor感觉有点繁琐. 对于上述的难点解决方式如下 1.数据类型都用text(除了id编号) 2.在activity中无论插入或更新都只用DB文件中同一个函数实现

云端深度学习框架TensorFlow读取数据IO的高效方式

低效的IO方式 最近通过观察PAI平台上TensoFlow用户的运行情况,发现大家在数据IO这方面还是有比较大的困惑,主要是因为很多同学没有很好的理解本地执行TensorFlow代码和分布式云端执行TensorFlow的区别.本地读取数据是server端直接从client端获得graph进行计算,而云端服务server在获得graph之后还需要将计算下发到各个worker处理(具体原理可以参考视频教程-Tensorflow高级篇:https://tianchi.aliyun.com/compet

浅析KJFrameForAndroid框架如何高效加载Bitmap_Android

我们在写Android程序的时候,肯定会用到很多图片.那么对于图片的压缩处理自然是必不可少.为什么要压缩?我想这个问题不必在强调了,每个人在最初学习Android的时候肯定都会知道这么一个原因:我们编写的应用程序都是有一个最大内存限制,其中JAVA程序和C程序(NDK调用时)共享这一块内存大小,程序占用了过高的内存就容易出现OOM(OutOfMemory)异常.至于这个最大内存是多少,我们可以通过调用Runtime.getRuntime().maxMemory()方法验证一下. 正因为受到内存大

Android如何高效显示较大的Bitmaps_Android

一.高效加载较大的Bitmaps      图片有各种形状和各种大小,在很多情况下,图片的实际大小都比图片在应用中所显示的大小要大的多,比如Android系统自带的 Gallery  应用显示的照片实际的分辨率通常比手机设备的密度要高很多      考虑到我们是在开发一款内存使用受限的应用,理想的情况下,我们只是想把一个低分辨率版本的位图载入内存,一般来说这个低分辨率版本的位图要跟UI元件实际需要显示的大小相符.一张高分辨率的图片并不会给我们带来任何明显的好处,但却会占用宝贵的内存资源和产生额外

云端TensorFlow读取数据IO的高效方式

低效的IO方式 最近通过观察PAI平台上TensoFlow用户的运行情况,发现大家在数据IO这方面还是有比较大的困惑,主要是因为很多同学没有很好的理解本地执行TensorFlow代码和分布式云端执行TensorFlow的区别.本地读取数据是server端直接从client端获得graph进行计算,而云端服务server在获得graph之后还需要将计算下发到各个worker处理(具体原理可以参考视频教程-Tensorflow高级篇:https://tianchi.aliyun.com/compet

Android实战教程第九篇之短信高效备份_Android

Android短信高效备份这篇文章,承接上一篇.使用高效的方式备份短信--xml序列化器. 存储短信,要以对象的方式存储.首先创建javabean: package com.itydl.createxml.domain; public class Message { private String body; private String date; private String address; private String type; public String getBody() { ret