4

私のアプリケーションでは、ユーザーが ContactPicker を使用して連絡先から人を追加できるようにしています。

IRandomAccessStreamWithContentType を Byte[] に変換しようとしています

IRandomAccessStreamWithContentType stream = await contactInformation.GetThumbnailAsync();
if (stream != null && stream.Size > 0)
{
    Byte[] bytes = new Byte[stream.Size];
    await stream.ReadAsync(bytes.AsBuffer(), (uint)stream.Size, Windows.Storage.Streams.InputStreamOptions.None);

私の Byte[] は空ではありません (約 10000 バイト)

しかし、Converter Byte[] to ImageSource を使用すると、BitmapImage の幅と高さが 0 になります。

このコンバーターを別のアプリケーションに使用していますが、うまく機能します...

public object Convert(object value, Type targetType, object parameter, string language)
{
    try
    {
        Byte[] bytes = (Byte[])value;
        if (bytes == null)
           return (new BitmapImage(new Uri((String)parameter)));
        BitmapImage bitmapImage = new BitmapImage();
        IRandomAccessStream stream = this.ConvertToRandomAccessStream(new MemoryStream(bytes));
        bitmapImage.SetSource(stream);
        return (bitmapImage);
    }
    catch
    {
       return (new BitmapImage(new Uri((String)parameter)));
    }

}
private IRandomAccessStream ConvertToRandomAccessStream(MemoryStream memoryStream)
{
    var randomAccessStream = new InMemoryRandomAccessStream();
    var outputStream = randomAccessStream.GetOutputStreamAt(0);
    outputStream.AsStreamForWrite().Write(memoryStream.ToArray(), 0, (Int32)memoryStream.Length);

    return randomAccessStream;
}

誰かが何が問題なのか知っていれば...

前もって感謝します。ネオクリプト

編集:私はすでにコンバーターを別のプロジェクトで使用しており、うまく機能しています。主な違いは、ストリームのオリジンが同じではないことです。

var reader = await file.OpenReadAsync();
using (DataReader dataReader = new DataReader(reader))
{
    var bytes = new byte[reader.Size];
    await dataReader.LoadAsync((uint)reader.Size);
    dataReader.ReadBytes(bytes);
    // Use of bytes
}
4

1 に答える 1

7

bytesあなたの場合、ゼロしか含まれていないと確信しています。読み取りコードを変更する必要があります。

var buffer = await stream.ReadAsync(bytes.AsBuffer(), (uint)stream.Size, InputStreamOptions.None);
bytes = buffer.ToArray();

またはさらに良いのは、一緒に避けることIBufferです:

await stream.AsStream().ReadAsync(bytes, 0, bytes.Length);

どちらの場合も、バイト配列には実際の値が含まれます。コンバータをまだ動作させることができず、これ以上トラブルシューティングを行う時間がありません。たぶん、他の誰かがそれを手伝ってくれるでしょう。

編集:

別のプロジェクトでコンバーターを使用しているかどうかはよくわかりませんが、非同期メソッドを使用しないと動作させることができなかったため、内部で使用できませんIValueConverter。変更ConvertToRandomAccessStreamした後、ビットマップは他の変更なしで期待どおりに作成されました(必須を除くawait):

private async Task<IRandomAccessStream> ConvertToRandomAccessStream(byte[] bytes)
{
    var randomAccessStream = new InMemoryRandomAccessStream();
    using (var writer = new DataWriter(randomAccessStream))
    {
        writer.WriteBytes(bytes);
        await writer.StoreAsync();
        await writer.FlushAsync();
        writer.DetachStream();
    }
    randomAccessStream.Seek(0);

    return randomAccessStream;
}

コンバーターを使用する代わりに、ビットマップを返すビュー モデルに追加のプロパティを配置しました。bytes プロパティ内で、ビットマップを作成するために async メソッドを呼び出しました。

public Byte[] ImageBytes
{
    get { return _imageBytes; }
    set
    {
        if (Equals(value, _imageBytes)) return;
        _imageBytes = value;
        OnPropertyChanged();
        CreateBitmap();
    }
}

public BitmapSource Image
{
    get { return _image; }
    set
    {
        if (Equals(value, _image)) return;
        _image = value;
        OnPropertyChanged();
    }
}

private async Task CreateBitmap()
{
    try
    {
        BitmapImage bitmapImage = new BitmapImage();
        IRandomAccessStream stream = await this.ConvertToRandomAccessStream(ImageBytes);
        bitmapImage.SetSource(stream);
        Image = bitmapImage;
    }
    catch
    {
        Image = null;
    }
}
于 2013-03-11T06:13:41.647 に答える