Frage

Ok, tut mir leid, das ist wahrscheinlich eine noob Frage, aber ich bin irgendwie stecken.

Also, was ich tue (auf meiner asp.net Anwendung), um ein Bild aus dem Dateisystem geladen wird:

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

Dann mache ich etwas Redimensionierung:

tempImage = my awesomeResizingFunction(tempImage, newSize);

und will es auf das Dateisystem in einem anderen Ort speichern diese mit:

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

und was ich bekommen, ist dieser Fehler:

"A generic error occurred in GDI+."

Ich weiß, dass das Bild „ok“ ist, weil ich es, um den Browser schreiben ändern und die Bilder sehen, die ich nur die Fehlermeldung erhalten, wenn ich versuche, es zu retten. Ich bin irgendwie neu und stecken, bin ich diese völlig falsch? (Na ja, ich denke, das ist klar, aber Sie wissen, was ich meine ...)

War es hilfreich?

Lösung

plz diesen Code versuchen ... Ich habe den gleichen Code für die Größenänderung Bild verwendet und zu speichern. wenn Sie irgendein Problem bekommen dann plz lass es mich wissen.

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);

wo fupProduct ist Fileupload-Steuerelement ID

Andere Tipps

Sind Sie sicher, dass der originalPath und newpath Punkt auf verschiedene Dateien? Wenn Sie Image.FromFile verwenden, bleibt die Datei gesperrt, bis Sie Entsorgen rufen das Bild, das auf die Ausnahme führen können Sie erwähnt. Sie könnten das Bild wie die statt laden:

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

Dieser Ansatz stellt sicher, dass die Datei am Ende des mit Block geschlossen ist

Ist es möglich, der ursprüngliche Strom das Originalbildes Sicherung geschlossen wurde? Wenn der Strom hinter einem Bitmap geschlossen wurde, starten Sie GDI + Fehler bekommen. Ich lief in diesem viel, wenn wir Bildverarbeitung auf unserer Website hinzugefügt.

Wenn Sie das Bitmap-Objekt in dem Visual Studio-Debugger öffnen, sehen Sie Ausnahmen anstelle der Werte der Eigenschaften? Wenn ja, ist es kein Problem mit der Operation speichern, aber die GDI + Schicht hat die Fähigkeit verloren, das Objekt zu verarbeiten, period.

Was ich fand, war ich brauchte, den Überblick über die MemoryStreams meiner Bitmaps Zugehörigkeit zu halten und sie alle zusammen zu halten. Ändern der Größe eines Bildes führte zu einem neuen Memorystream mit einem neuen Bitmap-Bild.

ich am Ende diese einfache Klasse erstellen (getrimmten einige zusätzliche Eigenschaften nicht benötigen hier):

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;
    }
}

Nun, ich es zu tun hatte mit Bildern auf unserer Website hochgeladen, und was ich fand, war, dass, wenn Asp.Net den Strom zu dem Antrag beigefügt recycelt werden alle plötzlichen Bildoperationen gestartet Ausflippen. Also, meine Lösung, ob dies der beste Weg war, es zu tun oder nicht, war es, die Daten aus dem Upload-Datenstrom zu meinem eigenen Memorystream zu kopieren, laden Sie das Bild aus, dass, und halten beide in diesen Behälter. Und wo immer ich ein neues Bild aus einem alten geschaffen, ich habe immer den Strom und das Bild zusammen.

Ich hoffe, das hilft.

EDIT: Ich bin auch daran interessiert zu sehen, wie Sie das Ändern der Bildgröße tun. Dies ist ein Ausschnitt aus wie ich tat uns:

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;
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top