最近在尝试Direct2D编程,挺好玩的。

但是有时候还是会用到GDI+来生成图片,但D2D绘图需要用到自己的D2DBitmap类。

因此需要转换,查阅了下网上的资料,写了这么一个方法:

 1 using System;
 2 using System.Windows.Forms;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Diagnostics;
 6 using DX = SharpDX;
 7 using D2D = SharpDX.Direct2D1;
 8 using WIC = SharpDX.WIC;
 9 using DDW = SharpDX.DirectWrite;
10 using DXGI = SharpDX.DXGI;
11 using SharpDX;
12 
13         public D2D.Bitmap ConvertFromSystemBitmap(System.Drawing.Bitmap bmp)
14         {
15             System.Drawing.Bitmap desBitmap;//预定义要是使用的bitmap
16             //如果原始的图像像素格式不是32位带alpha通道
17             //需要转换为32位带alpha通道的格式
18             //否则无法和Direct2D的格式对应
19             if (bmp.PixelFormat != System.Drawing.Imaging.PixelFormat.Format32bppPArgb)
20             {
21                 desBitmap = new System.Drawing.Bitmap(bmp.Width, bmp.Height, System.Drawing.Imaging.PixelFormat.Format32bppPArgb);
22                 using (System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(desBitmap))
23                 {
24                     g.DrawImage(bmp, 0, 0);
25                 }
26             }
27             else
28             {
29                 desBitmap = bmp;
30             }
31 
32 
33             //直接内存copy会非常快 
34             //如果使用循环逐点转换会非常慢
35             System.Drawing.Imaging.BitmapData bmpData = desBitmap.LockBits(
36                         new System.Drawing.Rectangle(0, 0, desBitmap.Width, desBitmap.Height),
37                         System.Drawing.Imaging.ImageLockMode.ReadOnly,
38                         desBitmap.PixelFormat
39                     );
40             int numBytes = bmpData.Stride * desBitmap.Height;
41             byte[] byteData = new byte[numBytes];
42             IntPtr ptr = bmpData.Scan0;
43             System.Runtime.InteropServices.Marshal.Copy(ptr, byteData, 0, numBytes);
44             desBitmap.UnlockBits(bmpData);
45 
46 
47 
48             D2D.BitmapProperties bp;
49             D2D.PixelFormat pixelFormat = new D2D.PixelFormat(DXGI.Format.B8G8R8A8_UNorm, D2D.AlphaMode.Premultiplied);
50 
51             bp = new D2D.BitmapProperties(
52                       pixelFormat,
53                       desBitmap.HorizontalResolution,
54                       desBitmap.VerticalResolution
55                     );
56             D2D.Bitmap tempBitmap = new D2D.Bitmap(_renderTarget, new Size2(desBitmap.Width, desBitmap.Height), bp);
57             tempBitmap.CopyFromMemory(byteData, bmpData.Stride);
58 
59             return tempBitmap;
60         }

PS.这里我用的是SharpDX组件,因为微软的Windows API Code Pack,只更新到1.1,2010年后就不维护了

posted @ 2015-01-03 18:57 蓝色的风之精灵 阅读(1179) 评论(0) 推荐(0) 编辑
摘要: 如果你的Controller是返回一个json的话,比如:return Json(new {result=true});在使用jquery上传文件,比如jquery.form、ajaxuploader、ajaxfileupload插件时,上传成功后,会变成下载文件。这时请将:return Json(new {result=true});改成:return Json(new {result=true... 阅读全文
posted @ 2009-06-10 17:32 蓝色的风之精灵 阅读(653) 评论(0) 推荐(0) 编辑
摘要: 昨天刚刚发现的。我做了个页面,文字输入框用的是背景图上的文字框,因此想让input不显示边框后和底图上的文字框对齐。本来很简单的事情,算一下左边距,css里写一下就OK了。事实上我用IE6,IE8,Fx,Chrome看了一下都没问题。就收工了。但回家用IE7一看,傻眼了。整个就乱了。于是跑回公司,用IE8的兼容模式一看,也是乱的。最后发现乱的原因是input框和form之间有一段距离,我试着调了f... 阅读全文
posted @ 2009-06-03 14:26 蓝色的风之精灵 阅读(631) 评论(2) 推荐(0) 编辑
摘要: 前几天常使用.Net 3.5里的Entity Framework做个网站的时候,发现了一个问题:添加记录时,对于DateTime型的数据,无法使用数据库的默认值。虽然不是什么严重的问题,但牛脾气上来了 ,就行解决这个问题。具体的情况是这样的,我的数据库有个Users表,三个字段,id,username,createtime。id是int型,自增长,主键username是nvchar(10)型,不允... 阅读全文
posted @ 2009-06-03 09:41 蓝色的风之精灵 阅读(3895) 评论(13) 推荐(1) 编辑
摘要: 试试看Windows Live Writer的图片上传 Technorati 标签: Windows Live Writer,WLW 阅读全文
posted @ 2008-07-22 16:10 蓝色的风之精灵 阅读(331) 评论(1) 推荐(0) 编辑
摘要: ColorMatrix(色彩矩阵),是GDI+里用来调整图片色彩的矩阵。 什么是矩阵,说白了就是C#里的二维数组。 那么这个矩阵调整色彩的原理是什么,他是怎么来调整色彩的呢?这个要从线性代数里的矩阵相乘说起。 以下段落学过线性代数的读者可以跳过,这里我用自己的理解来描述下矩阵相乘的算法和结果。 在线性代数里,两个矩阵相乘,是这样计算的: A矩阵乘以B矩阵,那么新生成一个矩阵C,C的第N行M列的元素... 阅读全文
posted @ 2008-07-22 14:50 蓝色的风之精灵 阅读(3446) 评论(7) 推荐(0) 编辑
摘要: 这个世界上有很多种语言,为了在计算机上能表现这些语言,各个国家在UTF-8出现前都制订了各自不同的字符编码标准。各自并不兼容。直到UTF-8出现才算是有了个统一的编码标准(现在发现UTF-8也不能包括世界上所有文字),但是老标准还是在各自沿用。比如中国,GB2312的网页还是很多的^_^ 那么怎么识别一个网页用的是什么编码呢? 一是网页或服务器直接报告浏览器,这个页面用的是什么编码。比如HTTP头... 阅读全文
posted @ 2008-07-09 12:25 蓝色的风之精灵 阅读(4760) 评论(20) 推荐(1) 编辑
摘要: 这该死的群贴图接收问题,早上好好的,中午就不行了。 修正了后,中午早上好了,下午又不行了…… 这叫什么事啊 阅读全文
posted @ 2008-05-07 20:51 蓝色的风之精灵 阅读(366) 评论(2) 推荐(0) 编辑
摘要:        不知道这个功能有多少人期待,反正我是很想要这个功能的,因为看着群里人说话贴表情,自己看不见是很郁闷的事情。狠狠心找来LumaQQ的Java代码,自己一点点翻译成C#的加了进去。呵呵,在这里感谢Luma前辈和阿不同学的辛勤劳动,没有他们这个功能也出不来。       ... 阅读全文
posted @ 2008-05-06 17:30 蓝色的风之精灵 阅读(1893) 评论(5) 推荐(0) 编辑
摘要:         QQ群有两个ID,内部ID和外部ID。外部ID就是我们平时常见的ID,搜索啊,查看啊,都是这个ID。         而内部ID就不常见了,应该说用QQ的人是从来不知道还有这个ID的。但是,这个ID是这篇文章的重点。因为发群信息必须用到这个I... 阅读全文
posted @ 2008-04-29 16:21 蓝色的风之精灵 阅读(3039) 评论(9) 推荐(0) 编辑
点击右上角即可分享
微信分享提示