Pregunta

Soy un principiante con WPF y tratando un proyecto de casa para familiarizarse con la tecnología.Tengo un simple formulario en donde el usuario selecciona un archivo de imagen, me, a continuación, mostrar los datos EXIF, junto con una miniatura de la imagen.Esto está funcionando bien, pero cuando selecciono un archivo de imagen RAW (~9 MB), puede haber una pequeña demora mientras el pulgar cargas, así que pensé que podría utilizar el BackgroundWorker para decodificar la imagen y el usuario puede ver los datos EXIF, entonces cuando la imagen ha sido decodificada se muestra.

El BitmapSource objeto es declarado en el BackgroundWorkers DoWork método:

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

el problema que estoy corriendo es que cuando intento configurar la fuente de mi control de Imagen en la RunWorkerCompleted método recibo un mensaje de error porque el objeto es propiedad de otro hilo.

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

He intentado utilizar la imgThumb.Dispatcher.BeginInvoke() método para establecer el origen, pero esto tampoco funcionó, supongo que es porque es el args.Result que es propiedad de otro hilo, y no la imgThumb?¿Cómo puedo conseguir alrededor de este?

Podría ser que yo era de codificación mi Despachador mal (el siguiente es de la memoria, he borrado lo que había).

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

Cualquier sugerencia o ideas son bienvenidas.

Actualización

Cambió mi DoWork método a utilizar BitmapCreateOptions.Ninguno, en lugar de .DelayCreation pero ahora me sale el siguiente error al cargar los archivos RAW (Canon .CR2 archivos es todo lo que he probado hasta la fecha), el código funciona bien para los archivos jpg.Este podría ser un problema con la Canon Codec he instalado el que me permita mostrar los archivos RAW?

La aplicación llama a una interfaz que fue comandada por una diferente subproceso.(Excepción de HRESULT:0x8001010E (RPC_E_WRONG_THREAD))

¿Fue útil?

Solución

Llame a Congelar() en el BitmapSource y no tienen este problema (Congelación se deshace de la roscado restricciones, pero hace que el objeto inmutable)

Otros consejos

Yo tenía exactamente la muestra problema y tuve la suerte de resolverlo.

Respuesta corta:envolver en WriteableBitmap.Que viene en un poco de precio, tú.

Respuesta larga.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top