问题描述
大概取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);}}
不错的实例,可以参考一下