Resize dinamico delle immagini per DeepZoom in Silverlight

Da alcuni giorni ho cominciato a lavorare ad una applicazione sviluppata in Silverlight che fa uso di DeepZoom. Nello specifico viene data la possibilità agli utenti di caricare foto in alta risoluzione che automaticamente finiscono nel wall.
Oltre alla parte più ovvia e scontata dell’upload della foto da parte dell’utente, ciò che risulta sicuramente interessante è la parte di resize dinamico delle immagini per DeepZoom, che può sembrare piuttosto complessa.
In un primo step avevo approcciato ad un sistema come quello spiegato qui, ma senza l’utilizzo dell’HttpHandler. Successivamente, grazie al preparatissimo Alessio, ho cambiato metodo andando ad utilizzare l’apposita libreria messa a disposizione da DeepZoom Composer, che possiamo trovare in “C:\Program Files\Microsoft Expression\Deep Zoom Composer” con il nome di DeepZoomTools.dll.

Questa libreria (totalmente managed) mette già a disposizione tutti i metodi necessari ad effettuare il resize e la creazione del file contenente la collection di foto rendendo semplice la parte di resize. Di fatto, una volta referenziata la libreria nel nostro progetto web, è semplicissimo effettuare il resize, come mostrato dagli snippet seguenti:

public void Image(string sourceFile, string targetFolder)
    {
        ImageCreator ic = new ImageCreator
                            {
                                TileSize = 256,
                                TileFormat = ImageFormat.Jpg,
                                ImageQuality = 0.95,
                                TileOverlap = 0
                            };

        string target = string.Concat(targetFolder, "\\output_images\\", Path.GetFileNameWithoutExtension(sourceFile));

        ic.Create(sourceFile, target);
    }

    public void Batch(string sourcePath, string targetFolder, bool generateCollectionFile)
    {
        List images = GetImagesInDirectory(sourcePath);
        List data = new List();

        foreach (string image in images)
        {
            Image(image, targetFolder);

            string target = string.Concat(targetFolder, "\\output_images\\", Path.GetFileNameWithoutExtension(image));
            data.Add(Path.ChangeExtension(target, ".xml"));
        }

        if (generateCollectionFile)
        {
            CollectionCreator cc = new CollectionCreator
                                    {
                                        TileSize = 256,
                                        TileFormat = ImageFormat.Jpg,
                                        MaxLevel = 8,
                                        ImageQuality = 0.95
                                    };

            cc.Create(data, string.Concat(targetFolder, "\\output"));
        }
    }

    private static List GetImagesInDirectory(string path)
    {
        return GetImagesInDirectory(new DirectoryInfo(path));
    }

    private static List GetImagesInDirectory(DirectoryInfo di)
    {
        List images = new List();

        // get all the images in this directory first
        foreach (FileInfo fi in di.GetFiles("*.jpg"))
            images.Add(fi.FullName);

        // get all the directories with their images
        foreach (DirectoryInfo sub in di.GetDirectories())
            images.AddRange(GetImagesInDirectory(sub));

        return images;
    }

Un grazie ad Alessio per l’ottima info.


Comments