到目前为止,我找到了很多针对这个问题的解决方案,但是没有一个能为我工作,因为我无法在WP8.1中使用File.ReadAllBytes
,或者我在设置BitmapImage的URISource时遇到了问题。
我正在使用以下代码从Windows Phone图片库中选择一张图片。 ()
private void PickPhotoButton_Tapped(object sender, TappedRoutedEventArgs e)
{
FileOpenPicker filePicker = new FileOpenPicker();
filePicker.SuggestedStartLocation = PickerLocationId.PicturesLibrary;
filePicker.ViewMode = PickerViewMode.Thumbnail;
// Filter to include a sample subset of file types
filePicker.FileTypeFilter.Clear();
filePicker.FileTypeFilter.Add(".bmp");
filePicker.FileTypeFilter.Add(".png");
filePicker.FileTypeFilter.Add(".jpeg");
filePicker.FileTypeFilter.Add(".jpg");
//filePicker.PickSingleFileAndContinue();
filePicker.PickMultipleFilesAndContinue();
view.Activated += viewActivated;
}
ObservableCollection<BitmapImage> myImageList = new ObservableCollection<BitmapImage>();
ObservableCollection<WriteableBitmap> alt_myImageList = new ObservableCollection<WriteableBitmap>();
private async void viewActivated(CoreApplicationView sender, IActivatedEventArgs args1)
{
FileOpenPickerContinuationEventArgs args = args1 as FileOpenPickerContinuationEventArgs;
if (args != null)
{
if (args.Files.Count == 0) return;
view.Activated -= viewActivated;
foreach (var item in args.Files)
{
// instead of item args.Files[0];
StorageFile storageFile = item;
var stream = await storageFile.OpenAsync(FileAccessMode.Read);
var bitmapImage = new BitmapImage();
await bitmapImage.SetSourceAsync(stream);
var wbImage = new WriteableBitmap(bitmapImage.PixelWidth, bitmapImage.PixelHeight);
wbImage.SetSource(stream);
var decoder = await Windows.Graphics.Imaging.BitmapDecoder.CreateAsync(stream);
//bitmapImage.UriSource = new Uri(item.Path, UriKind.Absolute);
myImageList.Add(bitmapImage);
alt_myImageList.Add(wbImage);
//Img.Source = bitmapImage;
ImageGrid.ItemsSource = myImageList;
ParentControl.Height = 450;
}
}
}
在这段代码中,我试图存储BitmapImage以及WritableBitmap。到目前为止我读过的大多数线程都建议使用WritableBitmap来解决我的问题,但如果我这样做,它们就不会显示出来。
对于ImageGrid,我使用以下XAML:
<GridView Name="ImageGrid">
<GridView.ItemTemplate>
<DataTemplate>
<StackPanel Margin="5">
<Image Width="50" Stretch="Fill" Name="Img" Source="{Binding}"></Image>
</StackPanel>
</DataTemplate>
</GridView.ItemTemplate>
</GridView>
正如我所说,在我选择了一张或多张图片之后,如果我存储ImageGrid.ItemsSource = myImageList;
,我只能看到它们。 ImageGrid.ItemsSource = alt_myImageList;
但我真正的问题是在以下代码中访问和处理图像文件:
private async void SendButton_Tapped(object sender, TappedRoutedEventArgs e) {
if (myImageList != null && alt_myImageList != null && myImageList.Count == alt_myImageList.Count)
foreach (var item in alt_myImageList){
}
到目前为止,这是我迄今为止在Sendbutton_Tapped函数中尝试过的尝试没有成功:
var test = item.UriSource;
var imageFile = await ApplicationData.Current.LocalFolder.CreateFileAsync(
"filename", CreationCollisionOption.ReplaceExisting);
var buffer = await FileIO.ReadBufferAsync(imageFile);
BitmapImage bitmapImage = new BitmapImage(item);
RandomAccessStreamReference rasr = RandomAccessStreamReference.CreateFromUri(bitmapImage.UriSource);
var streamWithContent = await rasr.OpenReadAsync();
byte[] bufferS = new byte[streamWithContent.Size];
var test2 = await streamWithContent.ReadAsync(bufferS.AsBuffer(), (uint)streamWithContent.Size, InputStreamOptions.None);
MemoryStream ms = new MemoryStream();
WriteableBitmap wb = item;
await wb.SetSourceAsync();
byte[] buffer = null;
wb.PixelBuffer.CopyTo(buffer);
wb.SaveJpeg(ms, myimage.PixelWidth, myimage.PixelHeight, 0, 100);
byte[] imageBytes = ms.ToArray();
你知道如何实现我的目标,即将此图像(BitmapImage或WritableBitmal)转换为byte [],但我可以上传它。
谢谢