2017-01-04 2 views
0

Я новичок в SharpDX, и я хочу имитировать код для рендеринга 24-битного растрового изображения прямо из памяти и отображения в PictureBox. * Этот код должен использоваться в более позднем проекте для быстрого отображения изображений из памяти.Почему SharpDX визуализирует мое растровое изображение в сером и поврежденном?

У меня нет проблем с использованием стандартного метода DrawImage(). Я выбираю SharpDX, потому что DrawImage работает слишком медленно.

Но когда я пытаюсь визуализации с помощью SharpDX, изображение становится серым цветом и поврежден (смотрите изображение ниже)

Изображение Я хочу сделать это в 24-битном RGB растрового изображения.

Использование DrawImage enter image description here

Использование SharpDX enter image description here

Что случилось с моим кодом?

Ниже мой код:

using System; 
using System.Windows.Forms; 
using SharpDX; 
using SharpDX.Direct2D1; 
using System.Diagnostics; 

namespace bitmap_test 
{ 
    public partial class Form1 : Form 
    { 
     private System.Drawing.Bitmap image1 = null; 
     private System.Drawing.Imaging.BitmapData bmpdata1 = null; 

     //target of rendering 
     WindowRenderTarget target; 

     //factory for creating 2D elements 
     SharpDX.Direct2D1.Factory factory = new SharpDX.Direct2D1.Factory(); 
     //this one is for creating DirectWrite Elements 
     SharpDX.DirectWrite.Factory factoryWrite = new SharpDX.DirectWrite.Factory(); 

     private SharpDX.DXGI.Format bmp_format = SharpDX.DXGI.Format.B8G8R8A8_UNorm; 
     private AlphaMode bmp_alphamode = AlphaMode.Ignore; 

     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void Form1_Load(object sender, EventArgs e) 
     { 
      InitSharpDX(); 

      //load 24-bit depth bitmap 
      LoadBitmapFromFile(@"D:\lena.bmp"); //https://software.intel.com/sites/default/files/forum/351974/lena.bmp 
     } 

     private void InitSharpDX() 
     { 
      //Init Direct Draw 
      //Set Rendering properties 
      RenderTargetProperties renderProp = new RenderTargetProperties() 
      { 
       DpiX = 0, 
       DpiY = 0, 
       MinLevel = FeatureLevel.Level_10, 
       PixelFormat = new PixelFormat(bmp_format, bmp_alphamode), 
       Type = RenderTargetType.Hardware, 
       Usage = RenderTargetUsage.None 
      }; 

      //set hwnd target properties (permit to attach Direct2D to window) 
      HwndRenderTargetProperties winProp = new HwndRenderTargetProperties() 
      { 
       Hwnd = this.pictureBox1.Handle, 
       PixelSize = new Size2(this.pictureBox1.ClientSize.Width, this.pictureBox1.ClientSize.Height), 
       PresentOptions = PresentOptions.Immediately 
      }; 

      //target creation 
      target = new WindowRenderTarget(factory, renderProp, winProp); 
     } 

     //load bmp file into program memory 
     private void LoadBitmapFromFile(string file) 
     { 
      image1 = (System.Drawing.Bitmap)System.Drawing.Image.FromFile(file, true); 
      var sourceArea = new System.Drawing.Rectangle(0, 0, image1.Width, image1.Height); 
      bmpdata1 = image1.LockBits(sourceArea, System.Drawing.Imaging.ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format24bppRgb); 
      image1.UnlockBits(bmpdata1); 
     } 

     private void drawBitmap(IntPtr pBuffer, int len, int width, int height) 
     { 
      try 
      { 
       var bitmapProperties = new BitmapProperties(new PixelFormat(bmp_format, bmp_alphamode)); 

       var size = new Size2(width, height); 

       int stride = width * 3; //only want RGB, ignore alpha 

       var bmp = new SharpDX.Direct2D1.Bitmap(target, size, new DataPointer(pBuffer, len), stride, bitmapProperties); 

       //draw elements 
       Draw(ref bmp); 
       bmp.Dispose(); 
      } 
      finally 
      { 
      } 
     } 

     private void Draw(ref SharpDX.Direct2D1.Bitmap bmp) 
     { 
      //begin rendering 
      target.BeginDraw(); 

      //clear target 
      target.Clear(null); 

      //draw bitmap 
      target.DrawBitmap(bmp, 1.0f, BitmapInterpolationMode.Linear); 

      //end drawing 
      target.EndDraw(); 
     } 

     //draw image using SharpDX 
     private void cmdRender_Click(object sender, EventArgs e) 
     { 
      if (bmpdata1 != null) 
      { 
       int len = bmpdata1.Width * bmpdata1.Height * 3; 
       var sw = Stopwatch.StartNew(); 
       drawBitmap(bmpdata1.Scan0, len, bmpdata1.Width, bmpdata1.Height); 
       sw.Stop(); 
       Console.WriteLine("SharpDX: {0}us", sw.ElapsedTicks/(TimeSpan.TicksPerMillisecond/1000)); 
      } 
     } 

     //draw image using DrawImage() 
     private void cmdDrawImage_Click(object sender, EventArgs e) 
     { 
      if (image1 != null) 
      { 
       var g = pictureBox1.CreateGraphics(); 
       var sourceArea = new System.Drawing.Rectangle(0, 0, image1.Width, image1.Height); 
       var sw = Stopwatch.StartNew(); 
       g.DrawImage(image1, sourceArea); //DrawImage is slow 
       sw.Stop(); 
       Console.WriteLine("DrawImage: {0}us", sw.ElapsedTicks/(TimeSpan.TicksPerMillisecond/1000)); 
      } 
     } 
    } 
} 

ответ

0

bmp_formatB8G8R8A8_UNorm не соответствует формату блокировки System.Drawing Format24bppRgb ... также использовать bmpdata1.Stride вместо вычисления потенциальной недопустимый шаг.

+0

Любая идея, какой формат я должен использовать для Format24bppRgb? – Dennis

0

Ваш шаг обычно представляет собой ширину растрового изображения, умноженное на глубину байта.

поэтому 512 * 4 будет 512-битным растровым изображением с 32-битной палитрой. Например, RGBA

Смежные вопросы