0

Kinect を使用してライブ実行中のビデオから bmp ファイルを作成しようとしています。その上にライブビデオを実行して画像を配置するアプリケーションを開発しています。私が使用している IDE は Visual Studio Professional 2010 です。win32 を使用して C++ で開発しているコードです。
. オーバーレイ画像と一緒にビデオを保存したい。現在、ビットマップをオーバーレイ表示するために ID2D1Bitmap を使用しています。しかし、画像がオーバーレイされたビデオから byte* データを取得する必要があります。ID2D1Bitmap から byte* データを取得する bmp ファイルを作成しようとしています。ただし、直接変換で byte* データを取得することはできません。

            m_pd2d1RenderTarget->DrawBitmap(m_pd2d1Bitmap_Image,D2D1::Rect(120,140, 120+Height,140+Width));
            m_pd2d1RenderTarget->DrawBitmap(m_pd2d1Bitmap_Video);

  I copied the data to the ID2D1Bitmap using the function called,
           m_pd2d1RenderTarget->CopyFromMemory(NULL,pvideo_Data,video_Info.bmWidthBytes); m_pd2d1RenderTarget->CopyFromMemory(NULL, pBitmap_Data,Bitmap_Info.bmWidthBytes);

しかし、今は両方のビットマップを結合し、そのバイト* データを取得したいと考えています。これらのビットマップをバイト * に変換することは可能ですか? ID2D1Bitmap から byte* データを取得するために利用できる直接変換はありますか???. また、ID2D1Bitmap を IWICBitmap に変換しようとしています。IWICBitmap->Lock を使用すると、byte* コンテンツを取得できるためです。したがって、次の疑問を解決し、貴重なガイダンスを提供してください。

1.ID2D1Bitmap から byte*? への変換。

2.ID2D1Bitmap を IWICBitmap に変換する方法は?.

前もって感謝します :)

よろしく、

Vvk。

4

1 に答える 1

0

私は次のようにC#でこれを行いました。私たちが書いたコードは、フレームからバイト配列をキャプチャし、Image タイプを作成し、以下の関数から Bitmap タイプに変換してから、後でファイルシステムに保存するために圧縮された jpeg として保存します。

using (DepthImageFrame depthFrame = e.OpenDepthImageFrame())
                {
                    if (depthFrame == null) return;
                    byte[] pixels = GenerateColoredBytes(depthFrame, first);

                    int stride = depthFrame.Width * 4;
                    depthImage.Source = BitmapSource.Create(depthFrame.Width, depthFrame.Height, 96, 96, PixelFormats.Bgr32, null, pixels, stride);

                    Bitmap btmap = GetBitmap((BitmapSource)depthImage.Source);

                    // Encoder parameter for image quality
                    long quality = 100000;
                    EncoderParameter qualityParam = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, quality);
                    // Jpeg image codec
                    ImageCodecInfo jpegCodec = getEncoderInfo("image/jpeg");
                    EncoderParameters encoderParams = new EncoderParameters(1);
                    encoderParams.Param[0] = qualityParam;

                    var stream = new MemoryStream(); // Create MemoryStream
                    btmap.Save(stream, jpegCodec, encoderParams); //(stream, ImageFormat.Jpeg); // Save Bitmap as .jpeg in MemoryStream                    

                    depthPath = "_UserTrialImages/" + UsernameInput.username + "/Date-" + DateTime.Now.ToString("MM.dd.yyyy");
                    gamePath = depthPath + "/Game-" + gameNumber;
                    trajectoryPath = gamePath + "/Trajectory-" + trajectoryNumber;     // one trajectory per super bubble appearance

                    string depthFile = "image" + ind[5] + ind[4] + ind[3] + ind[2] + ind[1] + ind[0] + ".jpg";
                    string pathFile = trajectoryPath + '/' + depthFile;

                    imageNumberCounter();
                    newImg.pathFile = pathFile;
                    newImg.stream = stream;

                    // saves depth images in list
                    listOfImages.Add(newImg);
                }

この関数を呼び出します:

Bitmap GetBitmap(BitmapSource source)
{
    Bitmap bmp = new Bitmap(source.PixelWidth, source.PixelHeight, System.Drawing.Imaging.PixelFormat.Format32bppPArgb);

    BitmapData data = bmp.LockBits(
      new System.Drawing.Rectangle(System.Drawing.Point.Empty, bmp.Size),
      ImageLockMode.WriteOnly,
      System.Drawing.Imaging.PixelFormat.Format32bppPArgb);

    source.CopyPixels(
      Int32Rect.Empty,
      data.Scan0,
      data.Height * data.Stride,
      data.Stride);

    bmp.UnlockBits(data);

    return bmp;
}

これは C++ にはありませんが、.NET 4.0 でコーディングしている場合は、C++ で上記と同じことを行う同等の関数があるはずです。お役に立てれば。

于 2013-03-01T03:34:08.950 に答える