c#image to byte [] windows phone 8.1

时间:2016-04-23 11:06:27

标签: c# xaml winrt-xaml

到目前为止,我找到了很多针对这个问题的解决方案,但是没有一个能为我工作,因为我无法在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 [],但我可以上传它。

谢谢

0 个答案:

没有答案