Изображение из изолированного хранилища - PullRequest
1 голос
/ 28 марта 2012

Я пытаюсь связать изображение, сохраненное в изолированном хранилище, и отобразить его на том же экране, что и камера, но не могу отобразить изображение. Я не знаю, так ли это, потому что я не сохраняю его на снимке с камеры телефона, но я не сохраняю их, потому что я собираюсь сделать несколько снимков и отобразить их в виде кинопленки в нижней части видоискателя камеры. Может кто-нибудь помочь мне, пожалуйста?

Я использую этот учебник Здесь

public partial class Page1 : PhoneApplicationPage
{
private static ObservableCollection<PhotoImage> photoList = new ObservableCollection<PhotoImage>();//For the class and list
private int savedCounter = 0;



public Page1()
{
        InitializeComponent();
}


private void ShutterButton_Click(object sender, RoutedEventArgs e)
    {
        if (cam != null)
        {
            try
            {
                // Start image capture.
                cam.CaptureImage();

            }
            catch (Exception ex)
            {
                this.Dispatcher.BeginInvoke(delegate()
                {
                    txtDebug.Text = ex.Message;
                });
            }
        }
    }

    void cam_CaptureCompleted(object sender, CameraOperationCompletedEventArgs e)
    {
        // Increments the savedCounter variable used for generating JPEG file names.
        savedCounter++;
    }

    void cam_CaptureImageAvailable(object sender, Microsoft.Devices.ContentReadyEventArgs e)
    {
        string fileName = "MyImage" + savedCounter + ".jpg";

        try
        {   

            // Save picture to the library camera roll.
            //library.SavePictureToCameraRoll(fileName, e.ImageStream);//dont want to save it to the camera roll


            // Set the position of the stream back to start
            e.ImageStream.Seek(0, SeekOrigin.Begin);

            // Save picture as JPEG to isolated storage.
            using (IsolatedStorageFile isStore = IsolatedStorageFile.GetUserStoreForApplication())
            {
                using (IsolatedStorageFileStream targetStream = isStore.OpenFile(fileName, FileMode.Create, FileAccess.Write))
                {
                    // Initialize the buffer for 4KB disk pages.
                    byte[] readBuffer = new byte[4096];
                    int bytesRead = -1;

                    // Copy the image to isolated storage. 
                    while ((bytesRead = e.ImageStream.Read(readBuffer, 0, readBuffer.Length)) > 0)
                    {
                        targetStream.Write(readBuffer, 0, bytesRead);
                    }

                }

            }

            Deployment.Current.Dispatcher.BeginInvoke(delegate()
            {

                photoList.Add(new PhotoImage(fileName));//here is where I set with the file name
                listBoxSearch.ItemsSource = photoList; //here is the binding 
            });


        }
        finally
        {
            // Close image stream
            e.ImageStream.Close();
        }

    }
    public class PhotoImage
    {

        public string PhotoItem { get; set; }

        public PhotoImage(string pItem)
        {
            this.PhotoItem = pItem;

        }
    }

вот мой код XAML

<!--LayoutRoot is the root grid where all page content is placed-->
<Grid x:Name="LayoutRoot" Background="Transparent">
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="640" />
        <ColumnDefinition Width="160" />
    </Grid.ColumnDefinitions>

    <Canvas x:Name="viewfinderCanvas" Width="640" HorizontalAlignment="Left" Margin="0,0,0,143">

        <!--Camera viewfinder -->
        <Canvas.Background>
            <VideoBrush x:Name="viewfinderBrush" />
        </Canvas.Background>
        <TextBlock Height="40" Name="txtDebug" Width="626" FontSize="24" FontWeight="ExtraBold" Canvas.Left="14" Canvas.Top="297" />
    </Canvas>

    <!--Button StackPanel to the right of viewfinder>-->
    <StackPanel Grid.Column="1" >
        <Button x:Name="ShutterButton" Content="SH" Click="ShutterButton_Click" FontSize="26" FontWeight="ExtraBold" Height="75" />
    </StackPanel>
    <Grid>
        <ListBox Foreground="RoyalBlue" Height="131"  Name="listBoxSearch"  Width="438"  TabIndex="10" Margin="96,343,106,6">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <StackPanel Orientation="Horizontal" Height="Auto" >
                        <Image Height="73" Width="73" VerticalAlignment="Top" Margin="0,10,8,0" Source="{Binding PhotoItem }" />
                    </StackPanel>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>

    </Grid>

</Grid>

1 Ответ

4 голосов
/ 28 марта 2012

Хорошо, проблема в том, что не существует неявного конвертера, который знает, как взять URI IsoStorage и загрузить его.

Одним из простых решений является добавление другого свойства в ваш класс PhotoImage и его привязка к нему- вот быстро и грязно:

public ImageSource SourceItem
{
  get
  {
    BitmapImage image = new BitmapImage();
    image.SetSource(isStore.OpenFile(PhotoItem, FileMode.Open));  
    return image;
  }
}

Обратите внимание, что это не очень хорошее решение - я просто показываю вам общую идею.Что нужно учитывать при реализации своих собственных действий:

  1. Поток не отбрасывается.Оберните Stream в использование при установке его на image.
  2. В зависимости от того, что вы пытаетесь сделать, вы можете использовать image.CreateOptions, чтобы сделать приложение более отзывчивым (но тогда вам нужночтобы понять, как обрабатывать поток, который необходимо держать открытым)
  3. Наконец, изображение, которое будет загружено, будет иметь полное разрешение.Возможно, вы захотите заглянуть в PictureDecoder.DecodeJpeg(), чтобы вместо этого загрузить миниатюру изображения (или посмотреть на миниатюру, предоставленную объектом камеры)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...