2017-08-11 2 views
0

Also ich habe einen Stream, was ich in der Lage sein soll, ist es in unsigned char * Bytes und zurück zu verwendbaren Stream zu übertragen.C++/CX Wie konvertiert man IRandomAccessStream^in Bytes und zurück. (UWP)

Dieser Strom ist Bild (es binär ist, wenn es wichtig ist?)

Im Grunde, was ich versuche, jetzt ist wie folgt:

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) 

Ich habe alle diese Aufgabe < hinzugefügt ... > weil es ohne sie nicht funktioniert, und ich bin mir nicht sicher, wie es funktioniert? Funktion GetPointerToPixelData ich online gefunden und folgt:

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; 
} 

Dank! :)

Antwort

0

Erstens, wenn Sie den Bildstrom in Bytes übertragen möchten, müssen Sie den Stream von lesen, nicht von DataWriter, die für Daten schreiben ist. Zweitens ist die DetachBuffer() Methode für "entfernt den Puffer, der dem Datenleser zugeordnet ist", den Puffer nicht lesen. Schließlich kann DataReader Bytes direkt durch ReadBytes(Byte[]) Methode lesen. Zum Beispiel:

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); 
    }); 
} 

Weitere Informationen zu lesen und eine Datei schreiben Sie bitte this document verweisen.

Verwandte Themen