سؤال

حسنا، أنا آسف، وربما هذا هو سؤال مستجد ولكن أنا عالقة كيندا.

وهكذا ما أفعله (على تطبيق asp.net بلدي) يتم تحميل صورة من نظام الملفات:

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

وثم أفعل بعض تحجيم:

tempImage = my awesomeResizingFunction(tempImage, newSize);

وتنوي حفظه إلى نظام الملفات في موقع آخر باستخدام هذا:

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

وماذا أحصل على هذا الخطأ:

"A generic error occurred in GDI+."

وأنا أعلم أن الصورة "موافق" لأنني لا أستطيع الكتابة بها إلى المتصفح ورؤية الصورة بحجم ثانية، أنا فقط الحصول على خطأ عندما أحاول حفظه. أنا جديدة نوعا ما وتمسك، أفعل هذا خاطئ تماما؟ (حسنا، أعتقد أن من الواضح لكنك تعرف ما أعنيه ...)

هل كانت مفيدة؟

المحلول

وبلز محاولة هذا الرمز ... ولقد استخدمت نفس رمز لتغيير حجم الصورة والادخار. اذا كان لديك أي مشكلة ثم بلز اسمحوا لي أن أعرف.

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

وحيث fupProduct هو fileupload ID السيطرة

نصائح أخرى

هل أنت متأكد من أن originalPath ونقطة newPath إلى ملفات مختلفة؟ عند استخدام Image.FromFile، الملف لا يزال مغلق حتى استدعاء التخلص على الصورة، التي يمكن أن تؤدي إلى استثناء التي ذكرتها. هل يمكن تحميل صورة من هذا القبيل بدلا من ذلك:

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

وهذا النهج يضمن أن الملف أغلق عند نهاية الكتلة باستخدام

هل من الممكن تم إغلاق التيار الأصلي دعم الصورة الأصلية؟ إذا تم إغلاق تيار وراء نقطية، يمكنك البدء في الحصول على GDI + أخطاء. جريت إلى هذا كثيرا عندما أضفنا معالجة الصور على موقعنا على الانترنت.

إذا فتح كائن صورة نقطية في مصحح الأخطاء Visual Studio، هل ترى استثناءات بدلا من قيم الخصائص؟ إذا كان الأمر كذلك، انها ليست مشكلة مع الحفظ العملية، ولكن GDI + طبقة فقدت القدرة على معالجة الكائن، هذه الفترة.

وماذا وجدت وكنت بحاجة إلى تتبع MemoryStreams ينتمون إلى الصور النقطية بلدي والاحتفاظ بها جميعا. تغيير حجم صورة أسفرت عن MemoryStream جديد مع صورة نقطية جديدة.

وانتهى بي المطاف خلق هذه فئة بسيطة (قلصت بعض خصائص إضافية لزوم لها هنا):

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

والآن، كنت أتعامل مع الصور التي تم تحميلها على موقعنا على شبكة الإنترنت، وما وجدته هو أنه عندما المعاد تدويرها Asp.Net تيار تعلق على طلب، بدأت جميع العمليات الصورة المفاجئة التقليب بها. هكذا يا الحل، سواء كان هذا أفضل طريقة للقيام بذلك أم لا، كان لنسخ البيانات من تيار تحميل لبلدي MemoryStream الخاصة، تحميل صورة عن ذلك، والعصا على حد سواء في هذه الحاوية. وحيثما أنا خلقت صورة جديدة من القديم، وأنا دائما أبقى تيار والصورة معا.

وآمل أن يساعد هذا.

وتحرير: أنا أيضا مهتمة في رؤية كيف حالكم تغيير حجم الصورة. هذا هو مقتطف من كيف فعلت لنا:

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;
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top