惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
S
SegmentFault 最新的问题
Recent Commits to openclaw:main
Recent Commits to openclaw:main
Attack and Defense Labs
Attack and Defense Labs
F
Full Disclosure
Vercel News
Vercel News
N
News | PayPal Newsroom
The GitHub Blog
The GitHub Blog
H
Hacker News: Front Page
H
Heimdal Security Blog
P
Privacy International News Feed
博客园 - 司徒正美
Google DeepMind News
Google DeepMind News
N
Netflix TechBlog - Medium
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
C
Cisco Blogs
L
Lohrmann on Cybersecurity
D
Docker
Recent Announcements
Recent Announcements
Security Archives - TechRepublic
Security Archives - TechRepublic
人人都是产品经理
人人都是产品经理
C
CXSECURITY Database RSS Feed - CXSecurity.com
P
Proofpoint News Feed
T
Tailwind CSS Blog
C
Check Point Blog
博客园 - 叶小钗
Google Online Security Blog
Google Online Security Blog
Martin Fowler
Martin Fowler
Stack Overflow Blog
Stack Overflow Blog
博客园 - 聂微东
S
Secure Thoughts
博客园 - Franky
博客园_首页
阮一峰的网络日志
阮一峰的网络日志
P
Palo Alto Networks Blog
Latest news
Latest news
量子位
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
博客园 - 三生石上(FineUI控件)
The Cloudflare Blog
Last Week in AI
Last Week in AI
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
Cyberwarzone
Cyberwarzone
小众软件
小众软件
Cisco Talos Blog
Cisco Talos Blog
Hacker News: Ask HN
Hacker News: Ask HN
T
Threatpost
T
Tenable Blog
P
Privacy & Cybersecurity Law Blog
WordPress大学
WordPress大学

博客园 - 熵星尘

苦逼的程序员都是这么玩游戏的(微信:天天连萌) 关于ASP.NET动态加载控件的几点实用总结 记录代码运行耗时的写法 关于Linq to DataTable not in的写法 DevExpress AspxGridView数据绑定 发现一个Membership的bug 无法将类型为“Oracle.DataAccess.Types.OracleString”的对象强制转换为类型“System.String”。 asp.net页面中文件下载的2种方式 - 熵星尘 - 博客园 gridview 的添加删除等技巧 全部按名称取值 【部分转】innerText 跟 innerHTML区别 asp.net验证组件membership登录失败的问题 母板页中的引用的图片,JS,css等路径问题 - 熵星尘 - 博客园 如何获取GridView的EmptyDataTemplate中的控件 Mutex实现单实例,你真的搞懂了吗?来看看吧。 VS2008 如何在WinForm中显示flash - 熵星尘 - 博客园 除夕晚的一帖:如何为repeater内部控件设置javascript,如何取得它们的客户端ID。 回发或回调参数无效。 问题的解决和思考 - 熵星尘 - 博客园 【作品发布】正式发布Tuff的神奇小软盘1.2 【作品发布】QQ2008远程自助 1.5.1.1
【原创】从图像转换到byte[]数组的几种方法
熵星尘 · 2009-02-11 · via 博客园 - 熵星尘

// 性能最高,其数组和像素一一对应
public static void test1(Image img)
        {
            Bitmap bmp 
= new Bitmap(img);
            BitmapData bitmapData 
= bmp.LockBits(new Rectangle(new Point(00), img.Size), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);byte[] BGRValues = new byte[bitmapData.Stride * bitmapData.Height];

            IntPtr Ptr 

= bitmapData.Scan0;
            System.Runtime.InteropServices.Marshal.Copy(Ptr, BGRValues, 
0, BGRValues.Length);

            bmp.UnlockBits(bitmapData);
        }

// 性能较低,数组内容较少,内容未知
        public static void test2(Image img)
        {
            System.Drawing.ImageConverter ic 
= new System.Drawing.ImageConverter();
            
byte[] btImage1 = new byte[0];
            btImage1 
= (byte[])ic.ConvertTo(img, btImage1.GetType());
        }
// 性能较低,数组内容为图片格式内容,格式未知
        public static void test3(Image img)
        {
            System.IO.MemoryStream ms 
= new System.IO.MemoryStream();
            img.Save(ms,ImageFormat.Bmp);
            
byte[] byteImage = new Byte[0];
            byteImage 
= ms.ToArray();
        }

下面说说他们的特点

test1和test3性能十分接近,test2性能要比前2个明显低一些,应为它们都是内存操作,当然快了。

test3在单次各种测试候都比test1要快一点点,真的是一点点,但是在做5000次测试时,test3就明显拉开了距离;

那么可以看出test3在某条语句上耗时了,但可能不是数组操作,比较在内存里,我个人认为是ImageFormat编码的耗时,当然,你用ImageFormat.Png获得的byte[]长度明显变短,

但是耗时也明显增加。

test2一如既往的明显慢。

接着我用了2*2的图片做测试,查看数组内容,有18个长度,test1的BitmapData是非常清晰的,包含bitmapData.Stride的部分,像素BGR排列。

其他2个的数组内容我个人都看不明白,呵呵,有兴趣的朋友也测试下。

test2的数组长度明显很短,不怎么明白。

下面我需要用他们做一些图片比较的工作,当然test1是首选,我很久以前就做好了这个类,使用数组值的突然死亡法,比test2计算hash值后比较的速度好太多了。

http://www.codeproject.com/dotnet/comparingimages.asp的算法使用了test2的方法,他说性能不错,这个我测试过了,比我慢太多了。

hash是个不错的想法,test2很短的数组值对于计算hash本身应该有优势。

那么: test2 时间 + test2 短数组 hash时间 <= test1 时间 + test1 标准像素数组 hash 时间   ???

这个需要测试,在我的一些应该中,将出现多次的图像比对,对时间要求非常高,选择哪种方法,就取决于耗时。

可以想象的是,没有了突然死亡法的全数组hash,是没有长远的出路的。。。