15

インターフェイスを実装するオブジェクトがあり、Windows::Storage::Streams::IBufferそこからバイトの配列を取得したいのですが、ドキュメントを見ると、このインターフェイスはかなり役に立たないように見え、ドキュメントには、組み合わせることができる他のクラスへの参照がありません。私の目的を達成するためにこのインターフェースで。これまでにグーグルで見つけたのは.NetクラスWindowsRuntimeBufferExtensionsへの参照だけですが、私はC ++を使用しているので、これも行き止まりです。

Windows::Storage::Streams::IBuffer誰かがC++でバイトの配列を取得する方法についてのヒントを与えることができますか?

4

7 に答える 7

12

エキゾチックなCOMキャストを介してIBufferByteAccessを使用できます。

byte* GetPointerToPixelData(IBuffer^ buffer)
{
   // Cast to Object^, then to its underlying IInspectable interface.

   Object^ obj = buffer;
   ComPtr<IInspectable> insp(reinterpret_cast<IInspectable*>(obj));

   // Query the IBufferByteAccess interface.
   ComPtr<IBufferByteAccess> bufferByteAccess;
   ThrowIfFailed(insp.As(&bufferByteAccess));

   // Retrieve the buffer data.

   byte* pixels = nullptr;
   ThrowIfFailed(bufferByteAccess->Buffer(&pixels));

   return pixels;

}

http://cm-bloggers.blogspot.fi/2012/09/accessing-image-pixel-data-in-ccx.htmlからコピーされたコードサンプル

于 2013-01-05T14:12:32.613 に答える
9

これはC++/CXバージョンです。

std::vector<unsigned char> getData( ::Windows::Storage::Streams::IBuffer^ buf )
{
    auto reader = ::Windows::Storage::Streams::DataReader::FromBuffer(buf);

    std::vector<unsigned char> data(reader->UnconsumedBufferLength);

    if ( !data.empty() )
        reader->ReadBytes(
            ::Platform::ArrayReference<unsigned char>(
                &data[0], data.size()));

    return data;
}

詳細については、ArrayおよびWriteOnlyArray(C ++ / CX)を参照してください。

于 2013-01-17T16:39:44.630 に答える
9

この方法も確認してください。

IBuffer-> Platform :: Array
CryptographicBuffer.CopyToByteArray

Platform :: Array-> IBuffer
CryptographicBuffer.CreateFromByteArray

ちなみに、単純なC ++配列から作成する場合は、次のようにPlatform::Array使用できますPlatform::ArrayReference

char* c = "sdsd";
Platform::ArrayReference<unsigned char> arraywrapper((unsigned char*) c, sizeof(c));
于 2013-05-20T08:57:00.507 に答える
5

前述のように、WindowsRuntimeBufferExtensions名前空間からはSystem::Runtime::InteropServices::WindowsRuntime.Netアプリケーションでのみ使用でき、ネイティブC++アプリケーションでは使用できません。

考えられる解決策は、以下を使用することWindows::Storage::Streams::DataReaderです。

void process(Windows::Storage::Streams::IBuffer^ uselessBuffer)
{
    Windows::Storage::Streams::DataReader^ uselessReader =
             Windows::Storage::Streams::DataReader::FromBuffer(uselessBuffer);
    Platform::Array<Byte>^ managedBytes = 
                         ref new Platform::Array<Byte>(uselessBuffer->Length);
    uselessReader->ReadBytes( managedBytes );                               
    BYTE * bytes = new BYTE[uselessBuffer->Length];
    for(int i = 0; i < uselessBuffer->Length; i++)
        bytes[i] = managedBytes[i];

    (...)
}
于 2012-08-13T20:12:53.287 に答える
3

これは、WinRT拡張機能で機能するはずです。

// Windows::Storage::Streams::DataReader
// buffer is assumed to be of type Windows::Storage::Streams::IBuffer
// BYTE = unsigned char

DataReader^ reader = DataReader::FromBuffer(buffer);

BYTE *extracted = new BYTE[buffer->Length];

// NOTE: This will read directly into the allocated "extracted" buffer
reader->ReadBytes(Platform::ArrayReference<BYTE>(extracted, buffer->Length));

// ... do something with extracted...

delete [] extracted; // don't forget to free the space
于 2015-03-13T13:45:02.017 に答える
2

この質問にはC ++/WinRTを使用した解決策を次に示します。これは基本的にこの回答と同じように機能しますが、はるかにアクセスしやすくなっています。投影の(文書化されていない)data()ヘルパーは、IBufferすべての面倒な作業を行います。

uint8_t* GetPointerToPixelData(::winrt::Windows::Storage::Streams::IBuffer const& buffer)
{
    return buffer.data();
}

WritableBitmap.PixelBuffer残念ながら、公式のドキュメントは(まだ)ありません。プロパティのサンプルコードでこれに遭遇しただけです(右上の言語ドロップダウンから[ C ++ / WinRT ]を選択してください)。

言語ドロップダウンから「C++/ CX」を選択すると、同じソリューション(IBufferByteAccessインターフェイスのクエリ)もそのドキュメントエントリから利用できます。

于 2019-05-03T17:54:38.223 に答える
-1

静的メソッドのように拡張メソッドを使用します

IBuffer *buffer;
array<unsigned char>^ result= System::Runtime::InteropServices::WindowsRuntime::WindowsRuntimeBufferExtensions::ToArray(buffer);
于 2012-08-07T20:55:45.960 に答える