C ++ / CX如何从IRandomAccessStream ^转换为字节并返回。 (UWP)

时间:2017-08-11 12:01:33

标签: c++ stream uwp buffer c++-cx

所以我有一个流,我想要的是将它转移到unsigned char *字节并返回到可用的流。

此流是图像(如果重要的话,它是二进制的吗?)

基本上我现在正在尝试的内容如下:

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)

我添加了所有这些任务&lt; ...&gt;因为没有他们就行不通,我不知道如何让它发挥作用? 函数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;
}

谢谢! :)

1 个答案:

答案 0 :(得分:1)

首先,如果要将图像流传输到字节,则需要按DataReader读取流,而不是DataWriter读取数据。其次,DetachBuffer()方法用于&#34;分离与数据读取器关联的缓冲区&#34;,而不是读取缓冲区。最后,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