Question

Je suis un débutant avec WPF et en essayant un projet de maison de se familiariser avec la technologie.J'ai un simple formulaire où l'utilisateur sélectionne un fichier image, je puis afficher les données EXIF avec une vignette de l'image.Cela fonctionne bien mais lorsque je sélectionne un fichier image RAW (~9 MO) il peut y avoir un léger retard alors que la manette de charges, donc je pensais que je pouvais utiliser le composant BackgroundWorker pour décoder l'image et l'utilisateur peut afficher les données EXIF, puis quand l'image a été décodé, il est affiché.

Le BitmapSource objet est déclaré dans la BackgroundWorkers DoWork méthode:

worker.DoWork += delegate(object s, DoWorkEventArgs args)
{
    string filePath = args.Argument as string;

    BitmapDecoder bmpDecoder = BitmapDecoder.Create(new Uri(filePath), BitmapCreateOptions.None, BitmapCacheOption.None);
    BitmapSource bmpSource = bmpDecoder.Frames[0];
    bmpSource.Freeze(); //As suggested by Paul Betts

    args.Result = bmpSource;
};

le problème que je suis en cours d'exécution, c'est quand j'essaie de définir la source de mon contrôle de l'Image dans la RunWorkerCompleted méthode j'ai un message d'erreur car l'objet est possédé par un autre thread.

worker.RunWorkerCompleted += delegate(object s, RunWorkerCompletedEventArgs args)
{
    imgThumb.Source = args.Result as BitmapSource;
};

J'ai essayé d'utiliser la imgThumb.Dispatcher.BeginInvoke() méthode pour définir la source, mais cela ne fonctionne pas non plus, je suppose que c'est parce que c'est la args.Result qui est détenue par un autre thread, et pas le imgThumb?Comment puis-je obtenir autour de cette?

Il se pourrait que j'ai été codage mon Répartiteur de mal (ce qui suit est à partir de la mémoire, j'ai supprimé ce que j'avais).

imgThumb.Dispatcher.Invoke(new Action<BitmapSource>(
    delegate(BitmapSource src)
    {
        imgThumb.Source = src;
    }
), bmpSource);

Toutes les suggestions ou idées sont les bienvenus.

Mise à jour

Changé mon DoWork de la méthode à utiliser BitmapCreateOptions.Aucune plutôt que .DelayCreation mais maintenant j'obtiens l'erreur suivante lors du chargement de fichiers RAW Canon .Fichiers CR2 est tout ce que j'ai testé à ce jour), le code fonctionne très bien pour les jpg.Cela pourrait-il être un problème de Codec Canon que j'ai installé pour me permettre d'afficher les fichiers RAW?

L'application appelle une interface qui a été mobilisé pour un autre fil de discussion.(Exception de HRESULT:0x8001010E (RPC_E_WRONG_THREAD))

Était-ce utile?

La solution

Appel de Gel() sur le BitmapSource et vous n'aurez pas ce problème (Gel de se débarrasser de l'enfilage des restrictions, mais fait l'objet immuable)

Autres conseils

J'ai eu exactement le problème modèle et a eu la chance de le résoudre.

Réponse courte:enveloppez-les dans du WriteableBitmap.Qui vient à un petit prix, tu.

Réponse longue.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top