2017-02-04 10 views
1

コードはとても使用バイトからビットマップを作成しようとしたC#WPFアプリケーションにうまく働いたが、私はフォームアプリケーションに書き込み可能なビットマップを作成カントとしてWindows Form applicationに適切に画像を表示することができませんLockbitsおよびMarshal Copyメソッド。画像フォーマットに問題はありますか?オンラインショップV1 C#のカント表示画像が正しく

enter image description here

これは私の現在のコードです。私はPixelFormat.Format32bppRgb形式でビットマップにバイトを変換するBytesToBitmap機能を追加しました。

コード:

public partial class Form1 : Form 
    { 
     private KinectSensor sensor; 
     private Bitmap colorBmp; 
     private Bitmap depthBmp; 
     private byte[] colorPxl; 
     private byte[] depthPxl; 

     public Form1() 
     { 
      InitializeComponent(); 
     } 


     public void formLoaded(object sender, EventArgs e) 
     { 
      foreach (var potenialK in KinectSensor.KinectSensors) 
      { 
       ... 
      } 

      if (null != this.sensor) 
      { 
       this.sensor.ColorStream.Enable(ColorImageFormat.RgbResolution640x480Fps30); 
       this.sensor.DepthStream.Enable(DepthImageFormat.Resolution320x240Fps30); 
       this.sensor.SkeletonStream.Enable(); 
       this.colorPxl = new byte[this.sensor.ColorStream.FramePixelDataLength]; 
       this.colorBmp = new Bitmap(this.sensor.ColorStream.FrameWidth, this.sensor.ColorStream.FrameHeight); 
       this.depthBmp = new Bitmap(this.sensor.DepthStream.FrameWidth, this.sensor.DepthStream.FrameHeight); 

       this.sensor.AllFramesReady += new EventHandler<AllFramesReadyEventArgs>(SensorAllFrameReady); 

       try 
       { 
        this.sensor.Start(); 
       } 
       catch (IOException) 
       { 
        this.sensor = null; 
       } 
      } 
     } 

     private void SensorAllFrameReady(object sender, AllFramesReadyEventArgs e) 
     { 
      using (ColorImageFrame colorFrame = e.OpenColorImageFrame()) 
      { 
       if (colorFrame != null) 
       { 
        colorFrame.CopyPixelDataTo(this.colorPxl); 

        this.pictureBox1.Image = BytesToBitmap(colorPxl, 640, 480); 

       } 
      } 

      using (DepthImageFrame depthFrame = e.OpenDepthImageFrame()) 
      { 
       if (depthFrame != null) 
       { 
        depthPxl = GenerateColoredBytes(depthFrame); 

        this.pictureBox2.Image = BytesToBitmap(depthPxl, 320, 240); 

       } 
      } 
     } 

     private byte[] GenerateColoredBytes(DepthImageFrame depthFrame) 
     { 
      ... 

      return pixels; 
     } 

     public static Bitmap BytesToBitmap(byte[] pixelData, int height, int width) 
     { 
      var bitmap = new Bitmap(width, height, System.Drawing.Imaging.PixelFormat.Format32bppRgb); 
      var bitmapData = bitmap.LockBits(new Rectangle(0, 0, width, height), System.Drawing.Imaging.ImageLockMode.WriteOnly, bitmap.PixelFormat); 
      var ptr = bitmapData.Scan0; 

      Marshal.Copy(pixelData, 0, ptr, pixelData.Length); 
      bitmap.UnlockBits(bitmapData); 

      return bitmap; 
     } 

答えて

0

だから、これは働いていたものです。 colorframeを直接BytesToBitmapに渡すと、フレームが正しく表示されます。

コード:

public static Bitmap ImageToBitmap(ColorImageFrame Image) 
     { 
      byte[] pixeldata = new byte[Image.PixelDataLength]; 
      Image.CopyPixelDataTo(pixeldata); 
      Bitmap bmap = new Bitmap(Image.Width, Image.Height, PixelFormat.Format32bppRgb); 
      BitmapData bmapdata = bmap.LockBits(
       new Rectangle(0, 0, Image.Width, Image.Height), 
       ImageLockMode.WriteOnly, 
       bmap.PixelFormat); 
      IntPtr ptr = bmapdata.Scan0; 
      Marshal.Copy(pixeldata, 0, ptr, Image.PixelDataLength); 
      bmap.UnlockBits(bmapdata); 
      return bmap; 
     } 
関連する問題