سؤال

أحصل على بيانات الصورة المخزنة على قاعدة البيانات كبايت [] صفيف ؛ ثم أقوم بتحويله إلى system.drawing.image مثل الكود الموضح أدناه ؛

  public System.Drawing.Image CreateImage(byte[] bytes)
        {

            System.IO.MemoryStream memoryStream = new System.IO.MemoryStream(bytes);
            System.Drawing.Image image = System.Drawing.Image.FromStream(memoryStream);
            return image;
        }

(*) من ناحية أخرى ، أخطط لعرض قائمة من الصور على صفحات ASP.NET حيث يقوم العميل بتمرير الصفحة. كلما زاد عدد المستخدمين وأسفل على الصفحة ، يرى/هي التي ترى المزيد من الصور. وهذا يعني تحميل الصفحة السريعة وتجربة المستخدم الغنية. (قد ترى ما أعنيه على www.mashable.com ، فقط اعتنوا بالأحمال الجديدة من الصور أثناء التمرير لأسفل.)

علاوة على ذلك ، فإن كائن Imgae الذي تم إرجاعه من الطريقة أعلاه ، كيف يمكنني إظهاره في حلقة باستخدام شروط (*) أعلاه.

تحياتي BK

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

المحلول

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

سأذهب مع الحل التالي:

  1. ستقوم قاعدة البيانات بتخزين الصور بالجودة الأصلية ؛
  2. سوف يعالج .ashx معالجات الصور على نظام الملفات في مختلف القرارات المطلوبة (مثل 32x32 بكسل للأيقونات ، 48 × 48 للتصوير المصغرة ، وما إلى ذلك) لإعادتها عند الطلب والوصول إلى قاعدة البيانات مرة واحدة فقط ؛ (في هذه يظهر مثال كيفية إرجاع صورة عبر معالج ASHX)
  3. ستشير الصفحات الفعلية إلى صفحة .ashx للحصول على صورة. (مثل <img scr="GetImage.ashx?ID=324453&Size=48" />)

تحديث:

لذا فإن سير العمل الفعلي في المعالج سيكون مثل:

    public void ProcessRequest (HttpContext context)
    {
        // Create path of cached file based on the context passed
        int size = Int32.Parse(context.Request["Size"]);
        // For ID Guids are possibly better
        // but it can be anything, even parameter you need to pass
        // to the web service in order to get those bytes
        int id = Int32.Parse(context.Request["Id"]);
        string imagePath = String.Format(@"images/cache/{0}/{1}.png", size, id);

        // Check whether cache image exists and created less than an hour ago
        // (create it if necessary)
        if (!File.Exists(imagePath)
            || File.GetLastWriteTime(imagePath) < DateTime.Now.AddHours(-1))
        {
            // Get the file from the web service here
            byte[] imageBytes = ...

            // Save as a file
            using (var memoryStream = new MemoryStream(imageBytes))
            using (var outputStream = File.OpenWrite(imagePath))
                Image.FromStream(memoryStream).Save(outputStream);
        }

        context.Response.ContentType = "image/png";
        context.Response.WriteFile(imagePath);
    }
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top