سؤال

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

أول كان يستخدم notmap.getThumbumnailImage، الذي استخدمته في الماضي ثم حفظه مباشرة في الاستجابة.

والثاني يستخدم system.grawing.graphics مع DrawImage (). لا يزال لا تذهب.

كان الثالث فقط لإنشاء صورة نقطية جديدة، تمر في الصورة النقطية القديمة، واضبط الحجم الجديد. نفس الخطأ.

قيمة لا يمكن أن تكون فارغة.
اسم المعلمة: التشفير

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

تفاصيل الاستثناء: System.ArgumentNullexception: لا يمكن أن تكون القيمة فارغة.
اسم المعلمة: التشفير

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

تتبع المكدس:
Argumentnulllexception: لا يمكن أن تكون القيمة فارغة.
اسم المعلمة: تشفير
system.drawing.image.save (دفق دفق، ImageCecodecinfo التشفير، التشفير encoderparams) +615244

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

public static System.Drawing.Image.GetThumbnailImageAbort thumbnailCallback = new System.Drawing.Image.GetThumbnailImageAbort(ThumbnailCallback);

    public static bool ThumbnailCallback()
    {
        return false;
    }

    /// <summary>
    /// 
    /// </summary>
    /// <param name="image"></param>
    /// <param name="size"></param>
    /// <remarks>
    /// This method will throw a AccessViolationException when the machine OS running the server code is windows 7.
    /// </remarks>
    /// <returns></returns>
    public static byte[] CreateThumbnail(byte[] imageData, Size size)
    {
        using (MemoryStream inStream = new MemoryStream())
        {
            inStream.Write(imageData, 0, imageData.Length);

            using (System.Drawing.Image image = Bitmap.FromStream(inStream))
            {
                Size thumbSize = GetThumbSize(new Size(image.Width, image.Height), size);

                //do not make image bigger
                if (thumbSize.Equals(image.Size) || (image.Width < size.Width || image.Height < size.Height))
                {
                    //if no shrinking is ocurring, return the original bytes
                    return imageData;
                }
                else
                {
                    using (System.Drawing.Image thumb = image.GetThumbnailImage(thumbSize.Width, thumbSize.Height, thumbnailCallback, IntPtr.Zero))
                    {

                        using (MemoryStream outStream = new MemoryStream())
                        {
                            thumb.Save(outStream, thumb.RawFormat);

                            return outStream.ToArray();
                        }
                    }
                }
            }
        }

    }

هذا الخط رمي الخطأ:

thumb.Save(outStream, thumb.RawFormat);

أيه أفكار؟ شكرا للمساعدة!

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

المحلول

أعتقد أن المشكلة قد تكون ترميز الصورة الأصلية. تؤدي IIRC، Save (Stream، Format) إلى إجراء مكالمة للحفظ (الدفق، التشفير، Params)، مع وضع التشفير من التنسيق؛ التي في حالتك هي التنسيق الأصلي للصورة.

وفقا لمحتوى المجتمع ل حفظ الطريقة, ، لن يترجم بعض التنسيقات بشكل جيد إلى تشفير مناسب.

أود أن أقترح عليك تحديد التشفير بنفسك، باستخدام بعض التنسيق القياسي مثل PNG.

يحاول:

thumb.Save(outStream, ImageFormat.Png, null); // optionally add encoder parameters here, like quality or luminescence

نصائح أخرى

إذا كان ما تحاول القيام به هو حفظه بتنسيق الخام، فيمكنك تجربة ما يلي، كما هو الحال في حالتي تعمل عندما يكون تنسيق الصورة الأصلي هو واحد مدعوم:

try
{
   thumb.Save(outStream, img.RawFormat);
}
catch (System.ArgumentNullException)
{
   thumb.Save(outStream, ImageFormat.Png);
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top