2017-08-11 4 views
0

Donc, j'ai un flux, ce que je veux être en mesure de le transférer en char * bytes non signé et de nouveau au flux utilisable.C++/CX Comment convertir depuis IRandomAccessStream^en octets et en arrière. (UWP)

Ce flux est l'image (il est binaire s'il est important?)

En fait ce que je suis en train est maintenant comme suit:

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) 

J'ai ajouté toutes ces tâches < ... > parce que ça ne marche pas sans eux, et je ne sais pas comment le faire fonctionner? Fonction GetPointerToPixelData J'ai trouvé en ligne et suit:

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

Merci! :)

Répondre

0

Tout d'abord, si vous souhaitez transférer le flux d'images en octets, vous devez lire le flux par DataReader, et non par DataWriter qui est pour les données d'écriture. Deuxièmement, la méthode DetachBuffer() est pour "Détache le tampon qui est associé au lecteur de données", pas lire le tampon. Enfin, DataReader peut directement lire les octets par la méthode ReadBytes(Byte[]). Par exemple:

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

Plus de détails pour lire et écrire un fichier s'il vous plaît référence this document.