Busca lo que quieras

Crear thumbnail sin pixelar con c# .net (Crear miniaturas)

Hola amigos...

Aquí les dejo un código para generar Thumbnail sin pixelar. Si bien encontré en todo lugar código que genera thumnail, el problema era que las imagenes quedaban super pixeladas, así que ahora con el código que coloco aquí, la foto queda como suavizada, lo que evita que se vea pixelada.

El código que debemos colocar es:


public void guardarFotoThumbnail(string srcnormal, string srcthumb)
    {
        System.Drawing.Image image = System.Drawing.Image.FromFile(srcnormal);
        getDimensionSinDistorsionar(image.Width, image.Height);
        generateThumnail(image, image.Width, image.Height, srcthumb);    
    }

public void getDimensionSinDistorsionar(int anchoOriginal, int altoOriginal)
    {
        double limitAnchoAlto = 150; //este valor lo puedes modificar, segun el tamano que quieras
        //identifico maximo valor
        double maximoValor;
        if (anchoOriginal > altoOriginal)
            maximoValor = Convert.ToDouble(anchoOriginal);
        else
            maximoValor = Convert.ToDouble(altoOriginal);
        //regla de tres con la dimension del thumnail y el maximo valor
        double porcentajeImagenReduccion = limitAnchoAlto / maximoValor;
        //asignar valores para thumnail
        anchoThumnail = Convert.ToInt32(Convert.ToDouble(anchoOriginal) * porcentajeImagenReduccion);
        altoThumnail = Convert.ToInt32(Convert.ToDouble(altoOriginal) * porcentajeImagenReduccion);


    }

public void generateThumnail(System.Drawing.Image imageOriginal, int srcWidth, int srcHeight, string srcthumb)
    {
        System.Drawing.Image image = imageOriginal;
        System.Drawing.Image thumbnail = new Bitmap(anchoThumnail, altoThumnail);
        System.Drawing.Graphics graphic = System.Drawing.Graphics.FromImage(thumbnail);
        graphic.InterpolationMode = InterpolationMode.HighQualityBicubic;
        graphic.SmoothingMode = SmoothingMode.HighQuality;
        graphic.PixelOffsetMode = PixelOffsetMode.HighQuality;
        graphic.CompositingQuality = CompositingQuality.HighQuality;
        graphic.DrawImage(image, 0, 0, anchoThumnail, altoThumnail);
        ImageCodecInfo[] info;
        info = ImageCodecInfo.GetImageEncoders();
        EncoderParameters encoderParameters;
        encoderParameters = new EncoderParameters(1);
        encoderParameters.Param[0] = new EncoderParameter(Encoder.Quality, 100L);
        thumbnail.Save(srcthumb, info[1], encoderParameters);
    }




Lo que tenemos que hacer entonces es llamar la siguiente función:


guardarFotoThumbnail(saveLocation, saveLocationThumb);

donde el primer parámetro es la ruta de la foto original, y el segundo, la ruta donde se va a guardar el thumbnail. Los dos son tipo string.

Nota: Recuerda que para que funcione el código anterior debemos de agregar los siguientes using en la página:


using System.Data;
using System.Drawing;
using System.Drawing.Imaging;
using System.Drawing.Drawing2D;

Además, recuerda que para generar los thumnails y poder guardar archivos debes tener los permisos adecuados sobre la carpeta.

Espero te sirva.


Sean felices! :)

11 comentarios:

  1. Me acaba de encontrar con tu codigo, bastante util, gracias, probando!!

    ResponderEliminar
  2. Espero te sirva... saludos... y gracias por comentar! ;)

    ResponderEliminar
  3. Acabo de usar tu código, la verdad me fue super útil.
    Lo única que modifiqué porque me daba error es en el método generateThumnail
    estas líneas (las copio por si alguien tuvo el mismo error "Error genérico en GDI+.")

    //thumbnail.Save(srcthumb, info[1], encoderParameters);
    Bitmap bmap = new Bitmap(thumbnail);

    bmap.Save(srcthumb, info[1], encoderParameters);

    Solo eso, saludos y Gracias!

    ResponderEliminar
    Respuestas
    1. Hola amigo yo ya reemplaze esas lineas pero me sigue saliendo "Error genérico en GDI+."
      envio el codigo de generatethumbail

      System.Drawing.Image image = imageOriginal;
      System.Drawing.Image thumbnail = new Bitmap(anchoThumnail, altoThumnail);
      System.Drawing.Graphics graphic = System.Drawing.Graphics.FromImage(thumbnail);
      graphic.InterpolationMode = InterpolationMode.HighQualityBicubic;
      graphic.SmoothingMode = SmoothingMode.HighQuality;
      graphic.PixelOffsetMode = PixelOffsetMode.HighQuality;
      graphic.CompositingQuality = CompositingQuality.HighQuality;
      graphic.DrawImage(image, 0, 0, anchoThumnail, altoThumnail);
      ImageCodecInfo[] info;
      info = ImageCodecInfo.GetImageEncoders();
      EncoderParameters encoderParameters;
      encoderParameters = new EncoderParameters(1);
      encoderParameters.Param[0] = new EncoderParameter(Encoder.Quality, 100L);
      //thumbnail.Save(srcthumb, info[1], encoderParameters);
      Bitmap bmap = new Bitmap(thumbnail);
      bmap.Save(srcthumb, info[1], encoderParameters);

      Eliminar
    2. Muchas gracias por tu aporte compañero.

      Eliminar
  4. Oye, muchas gracias por tu aporte. Espero que te haya sido de utilidad.

    Saludos.

    ResponderEliminar
  5. YAYA!!! gracias por el código, me salvó como no tienes idea

    ResponderEliminar
  6. La solución Solución al mensaje "Error genérico de GDI+"

    El problema viene por la ruta que estan utilizando, cuando lo publican en el servidor y mantienen esa misma ruta para el thumbail
    con el mismo nombre de la imagen mayor.. srcnormal y srcthumb

    En este metodo

    public void guardarFotoThumbnail(string srcnormal, string srcthumb)
    {
    System.Drawing.Image image = System.Drawing.Image.FromFile(srcnormal);
    getDimensionSinDistorsionar(image.Width, image.Height);
    generateThumnail(image, image.Width, image.Height, srcthumb);
    }
    Unicamente le cambie el nombre al thumbail y aun guardandola en la misma ruta de la grande ya no arroja el error..

    Espero les sirva.
    Gracias por el codigo, fue de gran ayuda para Mi.

    Saludos
    AC

    ResponderEliminar

Palabras Clave

.NET (93) AJAX (2) ajaxcontroltoolkit (2) Algoritmos (1) android (1) Angular (1) Arrays (1) AS2 o ActionScript 2.0 (1) AS3 o ActionScript 3.0 (64) ASP (7) ASP.NET (3) Azure (1) Azure DevOps (2) Backup (2) Batch (4) blogger (1) Browser Support (2) C# (53) Charts (1) Chorme extensions (1) Chrome (3) cmd (18) código postal (1) Colombia tips (1) command (1) Conexion remota (1) Controles Web .NET (24) Cookies (1) cordova (1) CSS (14) CSV (5) Cufon (1) DateTime (2) deployment (2) Desarrollo movil (2) Desarrollo web (5) Diseño (4) DNN o DotNetNuke (5) docker (1) Encuestas (1) Entity Framework (1) Error (1) Eval (2) Excel (4) Expresiones regulares (2) Facebook (14) fechas (1) Fiddler (1) FileUpload (1) Filezilla (1) Firefox (2) Flash (9) Fonts (3) FQL (1) frameworks (2) Futuro de la web (1) git (1) Google Code (13) Google Maps (4) hackintosh (3) hazard 10.6.2 (3) herramientas para developers (1) highchart (1) Hilos (2) Hosting Windows (18) HTML (38) HTML5 (6) IDE (1) IE (2) IE9 (1) IIS (13) imagenes (3) jasmine (2) java (1) jqgrid (2) Jquery y Javascript (90) jquery-ui (5) jQueryMobile (1) JSON (1) knockout (4) library (1) Link Interesantes (2) List (1) Macro (2) Matemáticas (2) Membership (6) Memoria (1) Mis Experiencias (3) momentjs (1) ms-dos (1) MSN (1) MVC (1) MVC4 (3) MySQL (2) node.js (4) Notepad++ (3) Notificaciones (1) ObjectDataSource (2) Online (2) Opinión (4) OSX (3) Parallels Plesk Panel (1) petapoco (1) PhantomJS (1) PHP (4) Porqué este blog (1) Powershell (1) Razor (3) Redes (2) REGEX (4) REST (1) SDK Android (1) Seguridad (1) SelectParameters (1) Selenium (2) sencha (3) sencha cmd (2) SEO (1) SMTP (2) Software útil (8) Solución (1) Soporte (1) SQL (15) SQL Server (58) SQLite (2) Store Procedures (20) String (5) Testing Code (2) texto (2) tips de datos (1) tips de desarrollo (1) TutoFaceAS3 (4) TutoProAS3 (4) Tutoriales (7) Tweenlite effects (3) Últimas noticias (1) unit testing (1) usb (1) VBA (1) Video (1) virus (1) Web API (2) Web Browsers (1) Web Forms (7) web.config (1) Webmaster (8) Webmatrix (1) webrole (1) webservices (1) webstorm (1) Win Forms (5) Windows (21) Windows 7 (1) Windows 8 (1) XML (2) Youtube API (2)