Foros del Web » Programación para mayores de 30 ;) » .NET »

Galeria de imagenes

Estas en el tema de Galeria de imagenes en el foro de .NET en Foros del Web. Hola a todos , mi problema es el siguiente: Tengo que crear en ASP con C# un formulario web que te permita seleccionar una imagen ...
  #1 (permalink)  
Antiguo 18/07/2008, 05:01
 
Fecha de Ingreso: diciembre-2007
Mensajes: 36
Antigüedad: 16 años, 4 meses
Puntos: 0
Galeria de imagenes

Hola a todos , mi problema es el siguiente:

Tengo que crear en ASP con C# un formulario web que te permita seleccionar una imagen del disco duro y la meta a una carpeta (que ha de ser creada en caso de que no exista) dentro de esa carpeta tendra que crear otras dos una para las imagenes (que deberan ser redimensionadas en caso de que excedan el tamaño que se fije) y otra con las miniaturas. y a su vez que se vayan añadiendo a una galeria en Silverlight.

La galeria en Silverligth la tengo pero no consigo encontrar un buen tutorial de como redimensionar las imagenes , hacer minaturas y crear las carpetas.

A ver si alguien me puede ayudar.

Gracias por adelantado
  #2 (permalink)  
Antiguo 23/07/2008, 03:36
 
Fecha de Ingreso: diciembre-2007
Mensajes: 36
Antigüedad: 16 años, 4 meses
Puntos: 0
Respuesta: Galeria de imagenes

Ya he la manera de hacerlo, el problema que tengo es que necesitaria que al redimensionar la miniatura mantuviese las proporciones para que no salga achatada, ¿alguien sabe como hacerlo?

Código:
      // Initialize variables

        string sSavePath;
        string sThumbExtension;
        int intThumbWidth;
        int intThumbHeight;

        // Set constant values

        sSavePath = "http://www.forosdelweb.com/images/";
        sThumbExtension = "_thumb";
        intThumbWidth = 160;
        intThumbHeight = 120;

        // If file field isn’t empty

        if (filUpload.PostedFile != null)
        {
            // Check file size (mustn’t be 0)

            HttpPostedFile myFile = filUpload.PostedFile;
            int nFileLen = myFile.ContentLength;
            if (nFileLen == 0)
            {
                lblOutput.Text = "No se ha subido ningun archivo.";
                return;
            }

            // Check file extension (must be JPG)

            if (System.IO.Path.GetExtension(myFile.FileName).ToLower() != ".jpg"&&
                    System.IO.Path.GetExtension(myFile.FileName).ToLower() != ".gif"&&
                        System.IO.Path.GetExtension(myFile.FileName).ToLower() != ".bmp")
            {
                lblOutput.Text = "La extension del archivo debe ser JPG, GIF o BMP";
                return;
            }
            string extension = System.IO.Path.GetExtension(myFile.FileName).ToLower();
            string idunico = DateTime.Now.ToFileTimeUtc().ToString();
            // Read file into a data stream

            byte[] myData = new Byte[nFileLen];
            myFile.InputStream.Read(myData, 0, nFileLen);

            // Make sure a duplicate file doesn’t exist.  If it does, keep on appending an 

            // incremental numeric until it is unique

            string sFilename = System.IO.Path.GetFileName(myFile.FileName);
 
                sFilename = System.IO.Path.GetFileNameWithoutExtension(myFile.FileName)
                                 +idunico+extension;

            // Save the stream to disk

            System.IO.FileStream newFile
                    = new System.IO.FileStream(Server.MapPath(sSavePath + sFilename),
                                               System.IO.FileMode.Create);
            newFile.Write(myData, 0, myData.Length);
            newFile.Close();

            // Check whether the file is really a JPEG by opening it

            System.Drawing.Image.GetThumbnailImageAbort myCallBack =
                           new System.Drawing.Image.GetThumbnailImageAbort(ThumbnailCallback);
            Bitmap myBitmap;
            try
            {
                myBitmap = new Bitmap(Server.MapPath(sSavePath + sFilename));

                // If jpg file is a jpeg, create a thumbnail filename that is unique.
                string sThumbFile = System.IO.Path.GetFileNameWithoutExtension(myFile.FileName)
                                                         + sThumbExtension + extension;
                    sThumbFile = System.IO.Path.GetFileNameWithoutExtension(myFile.FileName) +
                                  idunico + sThumbExtension + extension;

                // Save thumbnail and output it onto the webpage

                System.Drawing.Image myThumbnail
                        = myBitmap.GetThumbnailImage(int)(int)myBitmap.Width,
                                                     (int)(int)myBitmap.Height, myCallBack, IntPtr.Zero);
                myThumbnail.Save(Server.MapPath(sSavePath + sThumbFile));
                imgPicture.ImageUrl = sSavePath + sThumbFile;

                // Se muestra el resultado de la operación

                lblOutput.Text = "El archivo ha sido subido de forma satisfactoria";

                // Destroy objects

                myThumbnail.Dispose();
                myBitmap.Dispose();
            }
            catch (ArgumentException errArgument)
            {
                // The file wasn't a valid jpg file

                lblOutput.Text = "El archivo no es un JPG valido.";
                System.IO.File.Delete(Server.MapPath(sSavePath + sFilename));
            }
        }

Última edición por Ciberyo; 24/07/2008 a las 03:54 Razón: Correccion de la linea System.Drawing.Image myThumbnail = myBitmap.GetThumbnailImage(int)(int)...
  #3 (permalink)  
Antiguo 23/07/2008, 08:15
 
Fecha de Ingreso: julio-2008
Mensajes: 8
Antigüedad: 15 años, 9 meses
Puntos: 0
Respuesta: Galeria de imagenes

Prueba con esta funcion, a mi me funciono:

//BytesOriginal //original size
//ResizeImageFile(BytesOriginal, 600) //large
//ResizeImageFile(BytesOriginal, 198) //medium
//ResizeImageFile(BytesOriginal, 100) //small
// Helper Functions

Código:
public static byte[] ResizeImageFile(byte[] imageFile, int targetSize)
    {
        using (System.Drawing.Image oldImage = System.Drawing.Image.FromStream(new MemoryStream(imageFile)))
        {
            Size newSize = CalculateDimensions(oldImage.Size, targetSize);
            using (Bitmap newImage = new Bitmap(newSize.Width, newSize.Height, PixelFormat.Format24bppRgb))
            {
                using (Graphics canvas = Graphics.FromImage(newImage))
                {
                    canvas.SmoothingMode = SmoothingMode.AntiAlias;
                    canvas.InterpolationMode = InterpolationMode.HighQualityBicubic;
                    canvas.PixelOffsetMode = PixelOffsetMode.HighQuality;
                    canvas.DrawImage(oldImage, new Rectangle(new Point(0, 0), newSize));
                    MemoryStream m = new MemoryStream();
                    newImage.Save(m, ImageFormat.Jpeg);
                    return m.GetBuffer();
                }
            }
        }
    }

    private static Size CalculateDimensions(Size oldSize, int targetSize)
    {
        Size newSize = new Size();
        if (oldSize.Height > oldSize.Width)
        {
            newSize.Width = (int)(oldSize.Width * ((float)targetSize / (float)oldSize.Height));
            newSize.Height = targetSize;
        }
        else
        {
            newSize.Width = targetSize;
            newSize.Height = (int)(oldSize.Height * ((float)targetSize / (float)oldSize.Width));
        }
        return newSize;
    }
Luego no mas llamas a estos metodos:

byte[] variable = Clase.ResizeImageFile(FileUpload1.FileBytes, 100);

Y tu veras si los guardas en el disco duro o en la base de datos. Saludos

Última edición por Ivan05F; 01/08/2008 a las 09:04
  #4 (permalink)  
Antiguo 24/07/2008, 01:38
 
Fecha de Ingreso: diciembre-2007
Mensajes: 36
Antigüedad: 16 años, 4 meses
Puntos: 0
Respuesta: Galeria de imagenes

Acabo de ver tu mensaje , justo ayer habia encontrado una funcion que tambien vale , la pongo por si a alguien no le funciona la que has puesto tu Ivan

Código:
 const int Lx = 173;
                //  Ancho maximo para las miniaturas
                const int Ly = 234;
                float l2;
                float newHeight, newWidth;
                //  Alturam axima para las miniaturas
                if (((myBitmap.Width / Lx) > (myBitmap.Width / Ly)))
                {
                    l2 = myBitmap.Width;
                    newWidth = Lx;
                    newHeight = (myBitmap.Height * (Lx / l2));
                    if ((newHeight > Ly))
                    {
                        newWidth = (newWidth * (Ly / newHeight));
                        newHeight = Ly;
                    }
                }
                else
                {
                    l2 = myBitmap.Height;
                    newHeight = Ly;
                    newWidth = (myBitmap.Width
                                * (Ly / l2));
                    if ((newWidth > Lx))
                    {
                        newHeight = (newHeight * (Lx / newWidth));
                        newWidth = Lx;
                    }
                }
La comento 1 poco : Comprueba si es una imagen mas alta o ancha antes de redimensionar y luego redimensiona en la misma proporcion y en funcion al tamaño maximo que le hemos indicado.

Ahora estoy trabajando en hacerle un crop, solo me falta la libreria, cuando este listo lo subo
  #5 (permalink)  
Antiguo 24/07/2008, 02:44
 
Fecha de Ingreso: diciembre-2007
Mensajes: 36
Antigüedad: 16 años, 4 meses
Puntos: 0
Respuesta: Galeria de imagenes

Vale ya esta listo el crop (en teoria las miniaturas no son iguales y con la funcion que pongo ahora las recorta ahora al mismo tamaño)
Código:
//Donde acaba  el codigo anterior poneis esto
 myBitmap= ImageCrop(myBitmap, 173, 234, AnchorPosition.Center);
Despues añadis la enumeracion

Código:
  public enum AnchorPosition { Top, Center, Bottom, Left, Right }
y el procedimiento para realziar el crop

Código:
    
public static System.Drawing.Bitmap ImageCrop(System.Drawing.Bitmap imgPhoto,
                                                        int Width, int Height,  AnchorPosition Anchor)
    {
        int sourceWidth = imgPhoto.Width;
        int sourceHeight = imgPhoto.Height;
        int sourceX = 0;
        int sourceY = 0;
        int destX = 0;
        int destY = 0;

        float nPercent = 0;
        float nPercentW = 0;
        float nPercentH = 0;

        nPercentW = ((float)Width / (float)sourceWidth);
        nPercentH = ((float)Height / (float)sourceHeight);

        if (nPercentH < nPercentW)
        {
            nPercent = nPercentW;
            switch (Anchor)
            {
                case AnchorPosition.Top: 
                    destY = 0;
                    break;
                case AnchorPosition.Bottom:
                    destY = (int)(Height - (sourceHeight * nPercent));
                    break;
                default:
                    destY = (int)((Height - (sourceHeight * nPercent)) / 2);
                    break;
            }
        }
        else
        {
            nPercent = nPercentH;
            switch (Anchor)
            {
                case AnchorPosition.Left:
                    destX = 0;
                    break;
                case AnchorPosition.Right:
                    destX = (int)(Width - (sourceWidth * nPercent));
                    break;
                default:
                    destX = (int)((Width - (sourceWidth * nPercent)) / 2);
                    break;
            }

        }

        int destWidth = (int)(sourceWidth * nPercent);
        int destHeight = (int)(sourceHeight * nPercent);

        Bitmap bmPhoto = new Bitmap(Width, Height,
            PixelFormat.Format24bppRgb);
        bmPhoto.SetResolution(imgPhoto.HorizontalResolution,
            imgPhoto.VerticalResolution);

        Graphics grPhoto = Graphics.FromImage(bmPhoto);
        grPhoto.InterpolationMode = InterpolationMode.HighQualityBicubic;

        grPhoto.DrawImage(imgPhoto,
            new Rectangle(destX, destY, destWidth, destHeight),
            new Rectangle(sourceX, sourceY, sourceWidth, sourceHeight),
            GraphicsUnit.Pixel);

        grPhoto.Dispose();
        return bmPhoto;
    }

}
  #6 (permalink)  
Antiguo 30/07/2008, 02:01
 
Fecha de Ingreso: diciembre-2007
Mensajes: 36
Antigüedad: 16 años, 4 meses
Puntos: 0
Respuesta: Galeria de imagenes

Bueno a ver si me podeis ayudar que ya casi lo tengo terminado :(

La galeria ya me la genera bien el , ahora necesito que me construya el xml para la galeria en silverlight, el xml tiene que tener una pinta asi:

Edito: El codigo anterior era para construir un XML pero sin guardarlo en ningun lado (con otra funcion se mostraba , como si fuese una RSS), he encontrado un ejemplo bastante bueno de como construir un xml guardandolo en disco asi que aqui os lo dejo:

*************
*Nuevo codigo *
*************
Código:
  string Ruta = Server.MapPath("~/MiArchivo.xml");
        using (XmlTextWriter Escritor = new XmlTextWriter(Ruta, Encoding.UTF8))
        {
            Escritor.Formatting = Formatting.Indented;

            Escritor.WriteStartDocument();
            Escritor.WriteStartElement("Usuario");

            Escritor.WriteStartElement("Usuario");
            Escritor.WriteAttributeString("pais", "España");
            Escritor.WriteElementString("nombre", "Ciberyo");
            Escritor.WriteStartElement("ocupacion");
            Escritor.WriteString("Estudiante");
            Escritor.WriteEndElement();
            Escritor.WriteEndElement();
            
            Escritor.WriteEndDocument();

            Escritor.Close();
        }
Espero que le sea de utilidad a alguien

Última edición por Ciberyo; 31/07/2008 a las 02:58 Razón: El codigo que habia puesto construia un XML pero no lo guardaba
  #7 (permalink)  
Antiguo 01/08/2008, 09:02
 
Fecha de Ingreso: julio-2008
Mensajes: 8
Antigüedad: 15 años, 9 meses
Puntos: 0
Respuesta: Galeria de imagenes

Ciberyo Tu sabes x si acaso, como trabajar con

Código:
  • System.Drawing.Graphics
  • System.Drawing.Bitmap
Como hacer que te devuelva una imagen en el bitmap, que tenes guardada en la abse de datos?

Gracias x responder . . . . .
  #8 (permalink)  
Antiguo 22/08/2008, 01:56
 
Fecha de Ingreso: diciembre-2007
Mensajes: 36
Antigüedad: 16 años, 4 meses
Puntos: 0
Respuesta: Galeria de imagenes

Lo siento no, las funciones para manejar las imagenes las encontre en la web y las modifique muy poco, ademas yo no almaceno las bases imagenes en las bases de datos, lo que si te puedo decir es que para guardar una imagen en la base de datos es necesario serializarla
te dejo una url con un ejemplo aunque creo que no es el que yo segui en su dia aun asi espero que te sirva

http://www.webtaller.com/construccion/lenguajes/asp/lecciones/insertar_imagenes_en_una_base_de_datos_con_asp.php

un saludo
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 04:10.