zoukankan      html  css  js  c++  java
  • 将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年后就不维护了

  • 相关阅读:
    树莓派常用Linux命令
    列出树莓派中系统中建立了哪些用户、哪些组?
    树莓派的用户管理
    树莓派变成一个Web服务器: nginx + php + sqlite
    树莓派做web服务器(nginx、Apache)
    树莓派修改更新源
    树莓派安装mysql
    树莓派2 购买心得
    python写的屏保程序
    win32下利用python操作printer
  • 原文地址:https://www.cnblogs.com/lersh/p/4199830.html
Copyright © 2011-2022 走看看