2017-08-11 7 views
0

私はストリームを持っているので、それを符号なしchar *バイトに転送して使用可能なストリームに戻すことができます。C++/CX IRandomAccessStream ^からバイトに変換して戻す方法(UWP)

このストリームは、映像(?それが重要であるならば、それはバイナリである)

は、私が今しようとしていますどのような基本的にある、次のとおりです。

IRandomAccessStream^ inputStream; 

DataWriter^ dataWriter = ref new DataWriter(inputStream); 
IBuffer^ buffer1 = dataWriter->DetachBuffer(); 
unsigned char * bytes = GetPointerToPixelData(buffer1); 

DataWriter ^writer = ref new DataWriter(); 
writer->WriteBytes(Platform::ArrayReference<BYTE>(bytes, sizeof(bytes))); 
task<DataWriterStoreOperation^>(writer->StoreAsync()).get(); 
task<Windows::Foundation::IAsyncOperation<bool>>(writer->FlushAsync()).get(); 

IBuffer ^buffer2 = writer->DetachBuffer(); 
IRandomAccessStream^ newStream; 

task<Windows::Foundation::IAsyncOperationWithProgress<unsigned int, unsigned int>>(newStream->WriteAsync(buffer2)).get(); 
task<Windows::Foundation::IAsyncOperation<bool>>(newStream->FlushAsync()).get(); 
UseNewStream(newStream) 

私はこれらのタスク<のすべてを追加しました... >それがなければ働いていないし、それを動作させる方法がわからないからです。私はオンラインで見つけると、次のされ 機能GetPointerToPixelData:

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; 
    insp.As(&bufferByteAccess); 

    // Retrieve the buffer data. 

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

    return pixels; 
} 

ありがとう! :)

答えて

0

最初に、イメージストリームをバイトに転送する場合は、書き込みデータの場合はDataWriterではなく、DataReaderでストリームを読み取る必要があります。第2に、DetachBuffer()メソッドは、 "データリーダーに関連するバッファを切り離す"ためのものであり、バッファを読み取るものではありません。最後に、DataReaderは、ReadBytes(Byte[])メソッドによってバイトを直接読み取ることができます。たとえば、

uint64 length = 0; 
BYTE *extracted; 
void CleanImagetobyte::MainPage::btnconverttobyte_Click(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e) 
{ 
    create_task(KnownFolders::GetFolderForUserAsync(nullptr /* current user */, KnownFolderId::PicturesLibrary)) 
     .then([this](StorageFolder^ picturesFolder) 
    { 
     return picturesFolder->GetFileAsync("B.jpg"); 
    }).then([this](task<StorageFile^> task) 
    { 
     try 
     { 
      StorageFile^ file = task.get(); 
      auto name = file->Name; 
      return file->OpenAsync(FileAccessMode::Read); 
     } 
     catch (Exception^ e) 
     { 
      // I/O errors are reported as exceptions. 
     } 
    }).then([this](task<IRandomAccessStream^> task) 
    { 
     IRandomAccessStream^ inputStream = task.get(); 
     length = inputStream->Size; 
     IBuffer^ buffer = ref new Buffer(inputStream->Size); 
     inputStream->ReadAsync(buffer, inputStream->Size, InputStreamOptions::None); 
     DataReader^ reader = DataReader::FromBuffer(buffer); 
     extracted = new BYTE[buffer->Length]; 
     reader->ReadBytes(Platform::ArrayReference<BYTE>(extracted, buffer->Length)); 
    }); 
} 


void CleanImagetobyte::MainPage::btnconvertback_Click(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e) 
{ 
    create_task(KnownFolders::GetFolderForUserAsync(nullptr /* current user */, KnownFolderId::PicturesLibrary)) 
     .then([this](StorageFolder^ picturesFolder) 
    { 
     return picturesFolder->CreateFileAsync("newB.jpg", CreationCollisionOption::ReplaceExisting); 
    }).then([this](task<StorageFile^> task) 
    { 
     StorageFile^ file = task.get(); 
     Array<byte>^ arr = ref new Array<byte>(extracted, length); 
     FileIO::WriteBytesAsync(file, arr); 
    }); 
} 

さらに詳しい情報は、this documentを参照してください。

関連する問題