¿Cómo guardar imágenes de mapa de bits en almacenamiento aislado?

Estoy desarrollando el elemento web Silverlight utilizando el modelo de objetos del cliente. Obtengo la imagen de mapa de bits del servidor sharepoint. Ahora quiero guardar esta imagen de mapa de bits en un almacenamiento aislado. Entonces estoy usando el siguiente código

 WriteableBitmap wb = new WriteableBitmap(attachments);

 using (IsolatedStorageFile isoFile = IsolatedStorageFile.GetUserStoreForApplication())
 {
     using (IsolatedStorageFileStream isoStream =
     new IsolatedStorageFileStream("abcd1.jpg", FileMode.Create, isoFile))
     {
         using (StreamWriter sw = new StreamWriter(isoStream))
         {
             sw.Write(wb.ToByteArray());
         }
     }
 }

Ahora veo la imagen guardada en la ubicación C: \ Users \ Rent2 \ AppData \ LocalLow \ Microsoft \ Silverlight \ is \ vzvpufsm.s4i \ m0laonzr.til \ 1 \ s \ nkhajster01es5wdoyfxd0n5rd2dls3ovyu4wcdig04zjx44 \ fyaaafea

Cuando hago clic en él, me da un mensaje como "Imagen no válida". ¿Puede decirme cómo debo escribir código para poder ver la imagen real después de guardarla en un almacenamiento aislado?

preguntado el 01 de diciembre de 11 a las 13:12

3 Respuestas

    private void zipFile()
            {     
                context = Microsoft.SharePoint.Client.ClientContext.Current;
                Microsoft.SharePoint.Client.File.OpenBinaryDirect(
                        context,
                        @"/TemplateInvoice/" + App.templateFileName + ".xlsx", successFile, FailFile);                  
            }

    private void successFile(object sender, OpenBinarySucceededEventArgs args)
            {
                System.Windows.Deployment.Current.Dispatcher.BeginInvoke(() =>
                {
                    // Obtain the isolated storage for an application.
                    try
                    {
                        using (var store = IsolatedStorageFile.GetUserStoreForApplication())
                        {
                            Stream strm = args.Stream;

                            using (var isoStream = store.OpenFile(App.templateFileName + ".zip", FileMode.OpenOrCreate))
                            {
                                // Read the resource file into a byte array.
                                bytes = new byte[strm.Length];
                                int numBytesToRead = (int)strm.Length;
                                int numBytesRead = 0;
                                while (numBytesToRead > 0)
                                {
                                    // Read may return anything from 0 to numBytesToRead.
                                    int n = strm.Read(bytes, numBytesRead, numBytesToRead);
                                    // The end of the file is reached.
                                    if (n == 0)
                                        break;
                                    numBytesRead += n;
                                    numBytesToRead -= n;
                                }


                                numBytesToRead = bytes.Length;

                                // Write the byte array to the IsolatedStorageFileStream.
                                isoStream.Write(bytes, 0, numBytesToRead);
                                //isoStream.Dispose();
                            }

                            strm.Close();

                            string path = App.templateFileName + ".zip";
                            ZipHelp.UnZip(path, System.IO.Path.GetDirectoryName(path), 4096);

                            replaceFileContent();

                            string rootDirectory = System.Windows.Browser.HttpUtility.UrlDecode(path);
                            string fileName = ZipHelp.Zip(rootDirectory.Replace(".zip", ""), invoice);

                            //string filename = DateTime.Now.Day.ToString() + DateTime.Now.Month.ToString() + DateTime.Now.Year.ToString() + DateTime.Now.Hour.ToString() + DateTime.Now.Minute.ToString() + DateTime.Now.Second.ToString() + "Invoice1.xlsx";

                            // Read the resource file into a byte array.
                            using (var stream = store.OpenFile(fileName, FileMode.Open))
                            {

                                bytes = new byte[stream.Length];
                                int numBytesToRead = (int)stream.Length;
                                int numBytesRead = 0;
                                while (numBytesToRead > 0)
                                {
                                    // Read may return anything from 0 to numBytesToRead.
                                    int n = stream.Read(bytes, numBytesRead, numBytesToRead);
                                    // The end of the file is reached.
                                    if (n == 0)
                                        break;
                                    numBytesRead += n;
                                    numBytesToRead -= n;
                                }


                                InvoiceTemplete invoiceTemplate = new InvoiceTemplete(fileName, bytes, SetMessage);
                                invoiceTemplate.AddDocument(invoiceTemplate);
                            }

                        }

                        //mark rows as billed
                        foreach (var item in PrivatePayList)
                        {
                            MedwaiverViewModel MedwaiverViewModelObj = new MedwaiverViewModel();
                            MedwaiverViewModelObj.ChangeBillingStatus(item.ListItemId, "Billed");

                            if (MedwaiverTimeLogList != null)
                            {
                                MedwaiverTimeLogList.Remove(item);
                            }

                            if (ClientSpecificTimeLogList != null)
                            {
                                ClientSpecificTimeLogList.Remove(item);
                            }

                            if (rangeBoundTimeLogListForDate != null)
                            {
                                rangeBoundTimeLogListForDate.Remove(item);
                            }

                            if (vRangeBoundTimeLogListForDateAndClient != null)
                            {
                                vRangeBoundTimeLogListForDateAndClient.Remove(item);
                            }

                        }

                    }
                    catch (IsolatedStorageException isx)
                    {
                        MessageBox.Show(isx.Message);
                    }
                });
            }

     private void FailFile(object sender, OpenBinaryFailedEventArgs e)
            {
                System.Windows.Deployment.Current.Dispatcher.BeginInvoke(() =>
                {
                    MessageBox.Show("Fail");
                });
            }


//The following class zip and unzip the file

class ZipHelp
    {
        static List<string> folderPathList = new List<string>();      

        public static string Zip(string rootDirectory, string fileName)
        {
            byte[] buffer;

            using (var store = IsolatedStorageFile.GetUserStoreForApplication())
            {
                IsolatedStorageFileStream zipFileStream = store.CreateFile(fileName + ".xlsx");
                ZipOutputStream zipOutStream = new ZipOutputStream(zipFileStream);
                zipOutStream.UseZip64 = UseZip64.Off;
                //zipOutStream.CanPatchEntries

                foreach (var item in folderPathList)
                {
                    string entryName = "";

                    buffer = new byte[4096];

                    if (item.Substring(0,1) == @"/")
                    {
                        //removes leading /
                        entryName = item.Substring(1);
                    }
                    else
                    {
                        entryName = item;
                    }

                    ZipEntry entry = new ZipEntry(entryName);
                    //entry.CompressionMethod = CompressionMethod.Deflated;
                    //entry.
                    entry.IsZip64Forced();
                    //entry.IsDirectory



                    zipOutStream.PutNextEntry(entry);


                    using (IsolatedStorageFileStream stream = store.OpenFile(rootDirectory + @"\" + item, FileMode.Open))
                    {


int size;
                        do
                        {
                            size = stream.Read(buffer, 0, buffer.Length);
                            zipOutStream.Write(buffer, 0, size);
                        } while (size > 0);

                    stream.Close();
                }
            }

            zipOutStream.Close();
            zipFileStream.Close();
        }

        return fileName + ".xlsx";


        //string[] directories = GetLocationTypes();

        //zip();

        //string[] filenames = Directory.GetFiles(directories);

        //using (var store = IsolatedStorageFile.GetUserStoreForApplication())
        //{                
        //    using (var isoStream = store.OpenFile("@" + rootDirectory, FileMode.OpenOrCreate))
        //    {
        //        //foreach(string dir in 
        //    }
        //}
    }       

    private static string[] GetLocationTypes()
    {
        using (var store = IsolatedStorageFile.GetUserStoreForApplication())
        {
            return store.GetDirectoryNames();
        }

    }

    /// <summary>
    /// UnZip a file
    /// </summary>
    /// <param name="SrcFile">source file path</param>
    /// <param name="DstFile">unzipped file path</param>
    /// <param name="BufferSize">buffer to use</param>
    public static void UnZip(string SrcFile, string DstFile, int BufferSize)
    {
        folderPathList.Clear();

        IsolatedStorageFile store = IsolatedStorageFile.GetUserStoreForApplication();
        FileStream fileStreamIn = store.OpenFile(SrcFile, FileMode.Open, FileAccess.Read);

        ZipInputStream zipInStream = new ZipInputStream(fileStreamIn);
        string rootDirectory = System.Windows.Browser.HttpUtility.UrlDecode(SrcFile);
        rootDirectory = rootDirectory.Replace(".zip", "");
        store.CreateDirectory(rootDirectory);

        while (true)
        {
            ZipEntry entry = zipInStream.GetNextEntry();

            if (entry == null)
                break;

            if (entry.Name.Contains("/"))
            {
                string[] folders = entry.Name.Split('/');

                string lastElement = folders[folders.Length - 1];
                var folderList = new List<string>(folders);
                folderList.RemoveAt(folders.Length - 1);
                folders = folderList.ToArray();

                string folderPath = "";
                foreach (string str in folders)
                {
                    folderPath = folderPath + "/" + str;
                    if (!store.DirectoryExists(rootDirectory + "/" + folderPath))
                    {
                        store.CreateDirectory(rootDirectory + "/" + folderPath);
                    }
                }

                folderPath = folderPath + "/" + lastElement;
                writeToFile(BufferSize, fileStreamIn, zipInStream, rootDirectory, folderPath);

            }
            else
            {
                writeToFile(BufferSize, fileStreamIn, zipInStream, rootDirectory, entry.Name);
            }

        }

        zipInStream.Close();
        fileStreamIn.Close();

    }

    private static void writeToFile(int BufferSize, FileStream fileStreamIn, ZipInputStream zipInStream, string rootDirectory, string folderPath)
    {
        IsolatedStorageFile store1 = IsolatedStorageFile.GetUserStoreForApplication();
        FileStream fileStreamOut = store1.OpenFile(rootDirectory + "/" + folderPath, FileMode.Create, FileAccess.Write);

        folderPathList.Add(folderPath);

        int size;
        byte[] buffer = new byte[BufferSize];
        do
        {
            size = zipInStream.Read(buffer, 0, buffer.Length);
            fileStreamOut.Write(buffer, 0, size);
        } while (size > 0);


        fileStreamOut.Close();

    }
}

Respondido el 11 de enero de 12 a las 10:01

Agregue ICSharpCode.SharpZipLib.Silverlight dll en su proyecto - Shailesh Jaiswal

Puedo pensar en dos opciones viables aquí.

  1. En su código anterior, guarde la matriz de píxeles del WriteableBitmap. Luego, para restaurarlo, crearía un WriteableBitmap del tamaño apropiado y establecería la matriz de píxeles con los datos almacenados.

-O-

  1. Use una solicitud HttpWebRequest o WebClient para obtener el flujo de imagen sin procesar y guárdelo en IsolatedStorage.

Hay ventajas y desventajas para cada uno de estos, en el primer caso, los datos no están comprimidos y ocuparán más espacio en el almacenamiento aislado y no podrá abrir la imagen desde el disco fuera de Silverlight, similar al problema que tuvo anteriormente. . Para la segunda opción, puede encontrarse con problemas entre dominios si las imágenes están en un servidor diferente al de su archivo Silverlight XAP y también es un poco más complejo de implementar.

Respondido el 01 de diciembre de 11 a las 17:12

¿Puede proporcionar el código para el primero que ha sugerido? Me ayudará mucho - Shailesh Jaiswal

Aquí hay una muestra: csharperimage.jeremylikness.com/2009/07/… una cosa es que parece que todavía tendrá problemas entre dominios para acceder a la matriz de píxeles de un WriteableBitmap que se carga entre dominios, por lo que probablemente optaría por la segunda opción, ya que será más pequeña en el disco y más fácil de manejar . - Bill Reiss

El problema básico es que está almacenando la matriz de píxeles RGBA decodificados como un archivo JPEG, pero no son lo mismo. Su código es básicamente correcto: simplemente no puede usar este método para almacenarlo como un archivo JPEG. Pero si sabe que la imagen es, digamos, 800x600, puede crear un mapa de bits de escritura de 800x600 y luego establecer la propiedad Pixels en la matriz de bytes de la secuencia recuperada. O si no conoce las dimensiones cuando las recupera, puede almacenar las dimensiones como los dos primeros números enteros en la transmisión (antes de escribir los píxeles en la transmisión) y leer las dimensiones cuando esté leyendo el archivo. Efectivamente, estaría creando su propio formato .bmp muy simplista.

Respondido el 01 de diciembre de 11 a las 20:12

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.