将System.Drawing.Bitmap转换为Direct2D.D2DBitmap

最近在尝试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年后就不维护了

时间: 2024-10-24 13:18:26

将System.Drawing.Bitmap转换为Direct2D.D2DBitmap的相关文章

类库探源——System.Drawing.Bitmap

一.System.Drawing.Bitmap Bitmap 类: 封装GDI+ 位图,此位图由图形图像及其属性的像素数据组成.Bitmap 是用于处理由像素定义的图像的对象 命名空间: System.Drawing 程序集:   System.Drawing.dll 继承关系: 原型定义: [SerializableAttribute] [ComVisibleAttribute(true)] public sealed class Bitmap : Image 备注:GDI+ 支持下列文件格式

让System.Drawing.Bitmap可以在linux运行

.net core的bitmap使用的是以下类库,但无法在linux运行 https://github.com/CoreCompat/CoreCompat 在linux运行需要安装runtime.linux-x64.CoreCompat.System.Drawing  如果你的是.net core2.0,那么是使用v2类库 https://github.com/CoreCompat/System.Drawing

利用System.Drawing.Image类进行图片相关操作

C#中对图片的操作主要是通过System.Drawing.Image等类进行. 一.将图片转换为字节流 /// <summary> /// 图片处理帮助类 /// </summary> public static class PicProcessHelper { /// <summary> /// 将图片转换为指定的字节流 /// </summary> /// <param name="filePath">图片路径</p

.net学习笔记----利用System.Drawing.Image类进行图片相关操作

C#中对图片的操作主要是通过System.Drawing.Image等类进行. 一.将图片转换为字节流 /// <summary> /// 图片处理帮助类 /// </summary> public static class PicProcessHelper { /// <summary> /// 将图片转换为指定的字节流 /// </summary> /// <param name="filePath">图片路径</p

画布Drawing.Bitmap (验证码时候用的)

<1>一般处理程序的图片处理 详情请参考:http://wenku.baidu.com/link?url=SrVlKGG2nzVuBIxUf6O_7NurKyVK4OuOakZJ_ET3kNf4Wknx1sXuA36_6ZZtOg3QZj1O_EKCFETmz0D3bKToD1dMPpTgmRVypNelmYKM2Pq <pre class="csharp" name="code">using System; using System.Col

AutoCAD.Net/C#.Net QQ群:193522571 多个框架共一套代码在进行迁移时的问题,properties,resource,未能加载文件或程序集“System.Drawing, Version=4.0.0.0

此时在3.5框架工程中会出现 [未能加载文件或程序集“System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a”或它的某一个依赖项.系统找不到指定的文件. 行 123,位置 5.] 的错误,解决办法是将4.0.0.0改成2.0.0.0.如下面的代码. 另外,在namespace进行了修改后需要将“原命名空间.properties.resource ”改成“现在的命名空间.properties

C# System.Drawing.Graphics 画图后,如何保存一个低质量的图片,一个占用空间较小的图片

首先要控制图片保存后硬盘后的大小(即占用硬盘的空间,而非尺寸),真正要处理的是控制 System.Drawing.Bitmap.Save 方法的参数. 具体实现如下: private void ThumbPicture(Image SourceImage, int TargetWidth,string savePath) { int IntWidth; //新的图片宽 int IntHeight; //新的图片高 try { int TargetHeight = (int)Math.Round(

类库探源——System.Drawing

一.System.Drawing 命名空间简述 System.Drawing 命名空间提供访问 GDI+ 的基本功能,更高级的功能在 System.Drawing.Drawing2D,System.Drawing.Imaging 和 System.Drawing.Text 命名空间 程序集: System.Drawing.dll 二.System.Drawing.Image 简述 Image 类:为源自 Bitmap 和 Metafile 的类提供功能的抽象基类 命名空间: System.Dra

Asp.Net Core使用System.Drawing.Common部署到docker报错问题

原文:Asp.Net Core使用System.Drawing.Common部署到docker报错问题 Asp.Net Core 2.1发布后,正式支持System.Drawing.Common绘图了,可以用来做一些图片验证码之类的功能.但是把网站部署到docker容器里运行会遇到很多问题,也是非常闹心的,本文记录这些问题,希望帮到有需要的人. 创建网站 前提条件:安装最新版VS2017和Net Core SDK 2.1. 首先新建网站,选择Asp.Net Core 2.1 Web应用程序(模型