Domanda

Sono un principiante con WPF e sto provando un progetto domestico per acquisire familiarità con la tecnologia.Ho un modulo semplice in cui l'utente seleziona un file immagine, quindi visualizzo i dati EXIF ​​insieme a una miniatura dell'immagine.Funziona bene, ma quando seleziono un file immagine RAW (~ 9 MB) può verificarsi un leggero ritardo durante il caricamento del pollice, quindi ho pensato di poter utilizzare BackgroundWorker per decodificare l'immagine e l'utente può visualizzare i dati EXIF, quindi una volta decodificata l'immagine viene visualizzata.

L'oggetto BitmapSource è dichiarato nel metodo BackgroundWorkers DoWork:

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;
};

il problema che sto riscontrando è che quando provo a impostare l'origine del mio controllo Image nel metodo RunWorkerCompleted ricevo un errore perché l'oggetto è di proprietà di un altro thread.

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

Ho provato a utilizzare il imgThumb.Dispatcher.BeginInvoke() metodo per impostare l'origine ma neanche questo ha funzionato, immagino sia perché è il file args.Result che è di proprietà di un altro thread e non del file imgThumb?Come posso aggirare questo problema?

Potrebbe essere che stavo codificando in modo errato il mio Dispatcher (quello che segue è dalla memoria, ho cancellato quello che avevo).

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

Eventuali suggerimenti o idee sono benvenuti.

Aggiornamento

Ho modificato il mio metodo DoWork per utilizzare BitmapCreateOptions.None anziché .DelayCreation ma ora ricevo il seguente errore durante il caricamento dei file RAW (i file Canon .CR2 sono tutto ciò che ho testato fino ad oggi), il codice funziona correttamente per i jpg.Potrebbe trattarsi di un problema con il codec Canon che ho installato per consentirmi di visualizzare i file RAW?

L'applicazione ha chiamato un'interfaccia che è stata matrice per un thread diverso.(Eccezione da HRESULT:0x8001010E (RPC_E_WRONG_THREAD))

È stato utile?

Soluzione

Chiama Freeze() su BitmapSource e non avrai questo problema (il congelamento elimina le restrizioni di threading, ma rende l'oggetto immutabile)

Altri suggerimenti

Avevo esattamente il problema dell'esempio e ho avuto la fortuna di risolverlo.

Risposta breve:avvolgere WriteableBitmap.Questo ha un piccolo prezzo, tu.

Risposta lunga.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top