2011-09-03 75 views
13

He programado una aplicación que necesita para descargar archivos * .png y configurarla en el fondo del botón en WPF. Por lo tanto, cuando ejecuto este programa, se enfrenta al Error que"No se encontró ningún componente de imágenes adecuado para completar esta operación".

se ha encontrado ningún componente de imagen adecuada para completar esta operación "

Mi código es la siguiente:.

descargas primera aplicación el archivo con objeto de clase WebClient:

System.Net.WebClient wClient = new System.Net.WebClient(); 
Uri downloadUri = new Uri(MyUri, UriKind.Absolute); 
wClient.DownloadFileAsync(downloadUri, "MyImage.png"); 
wClient.DownloadFileCompleted += new System.ComponentModel.AsyncCompletedEventHandler(wClient_DownloadFileCompleted); 

y descarga evento cuando sólo se produjeron:

ImageBtn.Dispatcher.Invoke(new Action(() => 
{ 
    ImageBrush ib = new ImageBrush(); 
    BitmapImage bi = new BitmapImage(); 
    bi.BeginInit(); 
    bi.UriSource = new Uri("MyImage.png", UriKind.Relative); 
    bi.EndInit(); 

    ib.ImageSource = bi; 
    ImageBtn.Background = ib; 
} 

NOTA Debido a ejecutar estos bloques de códigos en BackgroundWorker, yo uso Dispatcher para establecer la propiedad botón Fondo

Así, cuando ejecuto el programa, System.NotSupportedException ocurrió de la siguiente manera:

Exception from HRESULT: 0x88982F50 
Error Code : -2003292336 
Message : No imaging component suitable to complete this operation was found. 
Source : PresentationCore 
Stack Trace : at System.Windows.Media.Imaging.BitmapDecoder.SetupDecoderFromUriOrStream(Uri uri, Stream stream, BitmapCacheOption cacheOption, Guid& clsId, Boolean& isOriginalWritable, Stream& uriStream, UnmanagedMemoryStream& unmanagedMemoryStream, SafeFileHandle& safeFilehandle) 
    at System.Windows.Media.Imaging.BitmapDecoder.CreateFromUriOrStream(Uri baseUri, Uri uri, Stream stream, BitmapCreateOptions createOptions, BitmapCacheOption cacheOption, RequestCachePolicy uriCachePolicy, Boolean insertInDecoderCache) 
    at System.Windows.Media.Imaging.BitmapImage.FinalizeCreation() 
    at System.Windows.Media.Imaging.BitmapSource.CompleteDelayedCreation() 
    at System.Windows.Media.Imaging.BitmapSource.get_WicSourceHandle() 
    at System.Windows.Media.Imaging.BitmapSource.get_DUCECompatiblePtr() 
    at System.Windows.Media.Imaging.BitmapSource.UpdateBitmapSourceResource(Channel channel, Boolean skipOnChannelCheck) 
    at System.Windows.Media.Imaging.BitmapSource.AddRefOnChannelCore(Channel channel) 
    at System.Windows.Media.Imaging.BitmapSource.System.Windows.Media.Composition.DUCE.IResource.AddRefOnChannel(Channel channel) 
    at System.Windows.Media.ImageBrush.AddRefOnChannelCore(Channel channel) 
    at System.Windows.Media.Brush.System.Windows.Media.Composition.DUCE.IResource.AddRefOnChannel(Channel channel) 
    at System.Windows.Media.RenderData.System.Windows.Media.Composition.DUCE.IResource.AddRefOnChannel(Channel channel) 
    at System.Windows.UIElement.RenderContent(RenderContext ctx, Boolean isOnChannel) 
    at System.Windows.Media.Visual.UpdateContent(RenderContext ctx, VisualProxyFlags flags, Boolean isOnChannel) 
    at System.Windows.Media.Visual.RenderRecursive(RenderContext ctx) 
    at System.Windows.Media.Visual.UpdateChildren(RenderContext ctx, ResourceHandle handle) 
    at System.Windows.Media.Visual.RenderRecursive(RenderContext ctx) 
    at System.Windows.Media.Visual.UpdateChildren(RenderContext ctx, ResourceHandle handle) 
    at System.Windows.Media.Visual.RenderRecursive(RenderContext ctx) 
    at System.Windows.Media.Visual.UpdateChildren(RenderContext ctx, ResourceHandle handle) 
    at System.Windows.Media.Visual.RenderRecursive(RenderContext ctx) 
    at System.Windows.Media.Visual.UpdateChildren(RenderContext ctx, ResourceHandle handle) 
    at System.Windows.Media.Visual.RenderRecursive(RenderContext ctx) 
    at System.Windows.Media.Visual.UpdateChildren(RenderContext ctx, ResourceHandle handle) 
    at System.Windows.Media.Visual.RenderRecursive(RenderContext ctx) 
    at System.Windows.Media.Visual.UpdateChildren(RenderContext ctx, ResourceHandle handle) 
    at System.Windows.Media.Visual.RenderRecursive(RenderContext ctx) 
    at System.Windows.Media.Visual.UpdateChildren(RenderContext ctx, ResourceHandle handle) 
    at System.Windows.Media.Visual.RenderRecursive(RenderContext ctx) 
    at System.Windows.Media.Visual.UpdateChildren(RenderContext ctx, ResourceHandle handle) 
    at System.Windows.Media.Visual.RenderRecursive(RenderContext ctx) 
    at System.Windows.Media.Visual.UpdateChildren(RenderContext ctx, ResourceHandle handle) 
    at System.Windows.Media.Visual.RenderRecursive(RenderContext ctx) 
    at System.Windows.Media.Visual.UpdateChildren(RenderContext ctx, ResourceHandle handle) 
    at System.Windows.Media.Visual.RenderRecursive(RenderContext ctx) 
    at System.Windows.Media.Visual.UpdateChildren(RenderContext ctx, ResourceHandle handle) 
    at System.Windows.Media.Visual.RenderRecursive(RenderContext ctx) 
    at System.Windows.Media.Visual.UpdateChildren(RenderContext ctx, ResourceHandle handle) 
    at System.Windows.Media.Visual.RenderRecursive(RenderContext ctx) 
    at System.Windows.Media.Visual.UpdateChildren(RenderContext ctx, ResourceHandle handle) 
    at System.Windows.Media.Visual.RenderRecursive(RenderContext ctx) 
    at System.Windows.Media.Visual.UpdateChildren(RenderContext ctx, ResourceHandle handle) 
    at System.Windows.Media.Visual.RenderRecursive(RenderContext ctx) 
    at System.Windows.Media.Visual.UpdateChildren(RenderContext ctx, ResourceHandle handle) 
    at System.Windows.Media.Visual.RenderRecursive(RenderContext ctx) 
    at System.Windows.Media.Visual.UpdateChildren(RenderContext ctx, ResourceHandle handle) 
    at System.Windows.Media.Visual.RenderRecursive(RenderContext ctx) 
    at System.Windows.Media.Visual.UpdateChildren(RenderContext ctx, ResourceHandle handle) 
    at System.Windows.Media.Visual.RenderRecursive(RenderContext ctx) 
    at System.Windows.Media.Visual.UpdateChildren(RenderContext ctx, ResourceHandle handle) 
    at System.Windows.Media.Visual.RenderRecursive(RenderContext ctx) 
    at System.Windows.Media.Visual.UpdateChildren(RenderContext ctx, ResourceHandle handle) 
    at System.Windows.Media.Visual.RenderRecursive(RenderContext ctx) 
    at System.Windows.Media.Visual.UpdateChildren(RenderContext ctx, ResourceHandle handle) 
    at System.Windows.Media.Visual.RenderRecursive(RenderContext ctx) 
    at System.Windows.Media.Visual.UpdateChildren(RenderContext ctx, ResourceHandle handle) 
    at System.Windows.Media.Visual.RenderRecursive(RenderContext ctx) 
    at System.Windows.Media.Visual.UpdateChildren(RenderContext ctx, ResourceHandle handle) 
    at System.Windows.Media.Visual.RenderRecursive(RenderContext ctx) 
    at System.Windows.Media.Visual.UpdateChildren(RenderContext ctx, ResourceHandle handle) 
    at System.Windows.Media.Visual.RenderRecursive(RenderContext ctx) 
    at System.Windows.Media.Visual.UpdateChildren(RenderContext ctx, ResourceHandle handle) 
    at System.Windows.Media.Visual.RenderRecursive(RenderContext ctx) 
    at System.Windows.Media.Visual.UpdateChildren(RenderContext ctx, ResourceHandle handle) 
    at System.Windows.Media.Visual.RenderRecursive(RenderContext ctx) 
    at System.Windows.Media.Visual.Render(RenderContext ctx, UInt32 childIndex) 
    at System.Windows.Media.CompositionTarget.Compile(Channel channel) 
    at System.Windows.Media.CompositionTarget.System.Windows.Media.ICompositionTarget.Render(Boolean inResize, Channel channel) 
    at System.Windows.Media.MediaContext.Render(ICompositionTarget resizedCompositionTarget) 
    at System.Windows.Media.MediaContext.RenderMessageHandlerCore(Object resizedCompositionTarget) 
    at System.Windows.Media.MediaContext.RenderMessageHandler(Object resizedCompositionTarget) 
    at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs) 
    at MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(Object source, Delegate method, Object args, Int32 numArgs, Delegate catchHandler) 
    at System.Windows.Threading.DispatcherOperation.InvokeImpl() 
    at System.Threading.ExecutionContext.runTryCode(Object userData) 
    at System.Runtime.CompilerServices.RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup(TryCode code, CleanupCode backoutCode, Object userData) 
    at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx) 
    at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) 
    at System.Windows.Threading.DispatcherOperation.Invoke() 
    at System.Windows.Threading.Dispatcher.ProcessQueue() 
    at System.Windows.Threading.Dispatcher.WndProcHook(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled) 
    at MS.Win32.HwndWrapper.WndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled) 
    at MS.Win32.HwndSubclass.DispatcherCallbackOperation(Object o) 
    at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs) 
    at MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(Object source, Delegate method, Object args, Int32 numArgs, Delegate catchHandler) 
    at System.Windows.Threading.Dispatcher.InvokeImpl(DispatcherPriority priority, TimeSpan timeout, Delegate method, Object args, Int32 numArgs) 
    at MS.Win32.HwndSubclass.SubclassWndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam) 
    at MS.Win32.UnsafeNativeMethods.DispatchMessage(MSG& msg) 
    at System.Windows.Threading.Dispatcher.PushFrameImpl(DispatcherFrame frame) 
    at System.Windows.Application.RunDispatcher(Object ignore) 
    at System.Windows.Application.RunInternal(Window window) 
    at WPF_KSMMessenger.App.Main() in C:\Users\Hossein\Desktop\WPF_KSMMessenger\WPF_KSMMessenger\obj\x86\Debug\App.g.cs:line 0 
    at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args) 
    at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() 
    at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx) 
    at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) 
    at System.Threading.ThreadHelper.ThreadStart() 

¿Qué debo hacer para resolver este problema?

Gracias por su atención.

+2

¿Revisaste el archivo? ¿es correcto? –

+1

¿Cuál es el sistema operativo? PNG en WPF en XP puede causar problemas. –

+1

@ Mr. Disappointment: ¡Estoy usando Win7, no XP! –

Respuesta

11

Su código funciona bien para mí en una imagen aleatoria seleccionada de Google images, así que supongo que la imagen que está descargando tiene un problema de algún tipo. Puede probar el siguiente código en el controlador justo antes de Dispatcher.Invocar.

var encoder = new PngBitmapEncoder(); 
var image = new BitmapImage(new Uri("MyImage.png", UriKind.Relative)); 
encoder.Frames.Add(BitmapFrame.Create(image)); 

using (var stream = new FileStream("MyImage2.png", FileMode.Create, FileAccess.Write)) 
{ 
    encoder.Save(stream); 
} 

A continuación, utilice "MyImage2.png" en su lugar. Es un intento de que el codificador "corrija" la imagen antes de cargarla en el pincel. Para ser sincero, aunque este código funciona para mí, casi no lo publico porque no tengo idea si funcionará para su situación, y no me gusta publicar el código cuando no conozco el resultado. Definitivamente avíseme si ayuda.

+0

Muchas gracias por su respuesta. He probado tu código, funciona bien en un proyecto separado, pero, en mi programa, todavía tiene ese problema. –

+0

¿Puedes publicar un enlace a una de las imágenes problemáticas? ¿O subir uno a algún lugar como imageshack? –

+0

He usado el enlace de imagen de avatar de yahoo. Estoy programando un programa de cliente de chat. Entonces, debo descargar y procesar estas imágenes. Estoy usando el enlace http://img.msg.yahoo.com/avatar.php?format=png&yids= para descargar imágenes. –

11

.png los archivos con un tamaño de archivo cero darán este error idéntico.

Cuestiones relacionadas