2017-08-11 60 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

首先,如果要将图像流转换为字节,则需要通过DataReader读取流,而不是通过用于写入数据的DataWriter读取。其次,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