Geo*_*inc 3 c# windows-runtime
在我的应用程序中,我允许用户使用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);
Run Code Online (Sandbox Code Playgroud)
我的字节[]不为空(约10000字节)
但是当我使用Converter Byte []到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;
}
Run Code Online (Sandbox Code Playgroud)
如果有人知道问题是什么......
提前致谢.NeoKript
编辑:我已经将我的转换器用于另一个项目,它运行良好.主要区别在于流具有不同的原点:
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
}
Run Code Online (Sandbox Code Playgroud)
我很确定bytes在你的情况下只包含零.你应该修改你的阅读代码:
var buffer = await stream.ReadAsync(bytes.AsBuffer(), (uint)stream.Size, InputStreamOptions.None);
bytes = buffer.ToArray();
Run Code Online (Sandbox Code Playgroud)
或者甚至更好,完全避免IBuffer:
await stream.AsStream().ReadAsync(bytes, 0, bytes.Length);
Run Code Online (Sandbox Code Playgroud)
在这两种情况下,字节数组现在都包含实际值.我仍然无法让你的转换器工作,我现在没有时间进一步排除故障.也许其他人会帮助你.
编辑:
我不确定你是否在另一个项目中使用转换器,但是如果不使用异步方法就无法在内部使用转换器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;
}
Run Code Online (Sandbox Code Playgroud)
我没有使用转换器,而是在视图模型中添加了一个返回位图的属性.在bytes属性中,我调用了用于创建位图的异步方法:
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;
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5910 次 |
| 最近记录: |