Ok, lo siento, esta es probablemente una pregunta de noob, pero estoy un poco atascado.

Así que lo que estoy haciendo (en mi asp.net de la aplicación) es la carga de una imagen del sistema de archivos:

System.Drawing.Image tempImage;
tempImage = System.Drawing.Image.FromFile(HttpContext.Server.MapPath(originalPath));

A continuación, hago un poco de cambio de tamaño:

tempImage = my awesomeResizingFunction(tempImage, newSize);

y tiene la intención de guardarlo en el sistema de archivos en otra ubicación con esto:

string newPath = "/myAwesomePath/newImageName.jpg";
tempImage.Save(newPath);

y lo que me sale es este error:

"A generic error occurred in GDI+."

Sé que la imagen es «aceptar» porque yo lo puedo escribir en el explorador y ver la imagen redimensionada, que sólo recibe el mensaje de error cuando trato de guardarlo. Yo soy un poco nuevo y pegado, estoy haciendo esta totalmente equivocado? (Bueno, supongo que es obvio, pero usted sabe a qué me refiero…)

InformationsquelleAutor onekidney | 2009-08-04

3 Comentarios

  1. 7

    plz prueba este código…he usado el mismo código para cambiar el tamaño de la imagen y guardar. si tienes cualquier problema, a continuación, plz que me haga saber.

    System.Drawing.Bitmap bmpOut = new System.Drawing.Bitmap(NewWidth, NewHeight);
    System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(bmpOut);
    g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
    g.FillRectangle(System.Drawing.Brushes.White, 0, 0, NewWidth, NewHeight);
    g.DrawImage(new System.Drawing.Bitmap(fupProduct.PostedFile.InputStream), 0, 0, NewWidth, NewHeight);
    MemoryStream stream = new MemoryStream();
    switch (fupProduct.FileName.Substring(fupProduct.FileName.IndexOf('.') + 1).ToLower())
    {
    case "jpg":
    bmpOut.Save(stream, System.Drawing.Imaging.ImageFormat.Jpeg);
    break;
    case "jpeg":
    bmpOut.Save(stream, System.Drawing.Imaging.ImageFormat.Jpeg);
    break;
    case "tiff":
    bmpOut.Save(stream, System.Drawing.Imaging.ImageFormat.Tiff);
    break;
    case "png":
    bmpOut.Save(stream, System.Drawing.Imaging.ImageFormat.Png);
    break;
    case "gif":
    bmpOut.Save(stream, System.Drawing.Imaging.ImageFormat.Gif);
    break;
    }
    String saveImagePath = Server.MapPath("../") + "Images/Thumbnail/" + fupProduct.FileName.Substring(fupProduct.FileName.IndexOf('.'));
    bmpOut.Save(saveImagePath);

    donde fupProduct es fileupload de ID de control

  2. 4

    ¿Estás seguro de que el originalPath y newPath punto a diferentes archivos ? Cuando el uso de la Imagen.FromFile, el archivo permanece bloqueado hasta que se llame a Disponer de la Imagen, que puede conducir a la excepción que se menciona. Usted puede cargar la imagen, como que en su lugar :

    Image tempImage = null;
    using (FileStream fs = new FileStream(originalPath, FileMode.Open, FileAccess.Read))
    {
    tempImage = Image.FromStream(fs);
    }
    ...

    Este enfoque garantiza que el archivo se cierra al final del bloque using

  3. 0

    Es posible que la secuencia original la copia de la imagen original ha sido cerrado? Si el arroyo detrás de un mapa de bits ha sido cerrado, empiezas a GDI+ errores. Me encontré con esto mucho cuando agregamos el procesamiento de la imagen a nuestro sitio web.

    Si se abre el objeto de mapa de bits en el depurador de Visual Studio, haga usted vea las excepciones en lugar de los valores de las propiedades? Si es así, no es un problema con la operación de guardar, pero la GDI+ capa ha perdido la capacidad para procesar el objeto, plazo.

    Lo que me encontré fue que necesitaba para seguir la pista de la MemoryStreams pertenecientes a mi los mapas de bits y mantener a todos juntos. Cambiar el tamaño de una imagen se tradujo en un nuevo MemoryStream con una nueva imagen de mapa de bits.

    Terminé la creación de esta clase simple (recortado algunas propiedades adicionales innecesarios aquí):

    public class UploadedImage : IDisposable
    {
    private Bitmap _img = null;
    private Stream _baseStream = null;
    ///<summary>
    ///The image object.  This must always belong to BaseStream, or weird things can happen.
    ///</summary>
    public Bitmap Img
    {
    [DebuggerStepThrough]
    get { return _img; }
    [DebuggerStepThrough]
    set { _img = value; }
    }
    ///<summary>
    ///The stream that stores the image.  This must ALWAYS belong to Img, or weird things can happen.
    ///</summary>
    public Stream BaseStream
    {
    [DebuggerStepThrough]
    get { return _baseStream; }
    [DebuggerStepThrough]
    set { _baseStream = value; }
    }
    [DebuggerStepThrough]
    public void Dispose()
    {
    if (Img != null)
    Img.Dispose();
    if (BaseStream != null)
    BaseStream.Close();
    _attached = false;
    }
    }

    Ahora, yo estaba tratando con las imágenes subidas a nuestra página web, y lo que encontré fue que cuando Asp.Net reciclado de la corriente adjunta a la Solicitud, de repente la imagen de operaciones comenzó a flipar. Así que mi solución, si esta era la mejor manera de hacerlo o no, era para copiar los datos de la carga de corriente a mi propia MemoryStream, carga la imagen de que, y se adhieren tanto en el envase. Y donde he creado una nueva imagen a partir de un viejo, siempre he mantenido el flujo y la imagen juntos.

    Espero que esto ayude.

    EDIT: yo también estoy interesado en ver cómo se está haciendo el cambio de tamaño de imágenes. Este es un fragmento de cómo hice la nuestra:

    temp = new Bitmap(newWidth, newHeight, PIXEL_FORMAT);
    temp.SetResolution(newHorizontalRes, newVerticalRes);
    gr = Graphics.FromImage(temp);
    //
    //This copies the active frame from 'img' to the new 'temp' bitmap.
    //Also resizes it and makes it super shiny.  Sparkle on, mr image dude.
    //
    Rectangle rect = new Rectangle(0, 0, newWidth, newHeight);
    gr.InterpolationMode = InterpolationMode.HighQualityBicubic;
    gr.SmoothingMode = SmoothingMode.HighSpeed;
    gr.PageUnit = GraphicsUnit.Pixel;
    gr.DrawImage(img, rect);
    //
    //Image copied onto the new bitmap.  Save the bitmap to a fresh memory stream.
    //
    retval = new UploadedImage();
    retval.BaseStream = (Stream)(new MemoryStream());
    temp.Save(retval.BaseStream, ImageFormat.Jpeg);
    retval.Img = temp;

Dejar respuesta

Please enter your comment!
Please enter your name here