سؤال

هل هناك طريقة لربط MemoryStream بـ asp: التحكم في الصورة؟

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

المحلول

يمكن للمعالج قبول معلمة URL مثل أي طلب آخر.لذا بدلاً من ربط ملفك <asp:image/> ل image.ashx كنت قد قمت بتعيينه على image.ashx?ImageID=[Your image ID here].

نصائح أخرى

أفضل رهان هو إنشاء HttpHandler الذي سيعيد الصورة.ثم قم بربط خاصية ImageUrl الموجودة على asp:Image بعنوان url الخاص بـ HttpHandler.

وهنا بعض التعليمات البرمجية.

قم أولاً بإنشاء HttpHandler:

<%@ WebHandler Language="C#" Class="ImageHandler" %>

using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using System.Web;

public class ImageHandler : IHttpHandler
{    
    public void ProcessRequest (HttpContext context)
    {
        context.Response.Clear();

        if (!String.IsNullOrEmpty(context.Request.QueryString["id"]))
        {
            int id = Int32.Parse(context.Request.QueryString["id"]);

            // Now you have the id, do what you want with it, to get the right image
            // More than likely, just pass it to the method, that builds the image
            Image image = GetImage(id);

            // Of course set this to whatever your format is of the image
            context.Response.ContentType = "image/jpeg";
            // Save the image to the OutputStream
            image.Save(context.Response.OutputStream, ImageFormat.Jpeg);
        }
        else
        {
            context.Response.ContentType = "text/html";
            context.Response.Write("<p>Need a valid id</p>");
        }
    }

    public bool IsReusable
    {
        get
        {
            return false;
        }
   }

   private Image GetImage(int id)
   {
       // Not sure how you are building your MemoryStream
       // Once you have it, you just use the Image class to 
       // create the image from the stream.
       MemoryStream stream = new MemoryStream();
       return Image.FromStream(stream);
   }
}

بعد ذلك، ما عليك سوى الاتصال به داخل صفحة aspx الخاصة بك حيث تستخدم asp:Image.

<%@ Page Language="C#" AutoEventWireup="true"  CodeFile="Default.aspx.cs" Inherits="_Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
        <div>
            <asp:Image ID="myImage" ImageUrl="~/ImageHandler.ashx?id=1" runat="server" />
        </div>
    </form>
</body>
</html>

وهذا هو عليه.

أفترض أنك بحاجة إلى إنشاء صور ديناميكية من ASP.NET قد تكون محظوظًاhttp://www.codeplex.com/aspnet/Release/ProjectReleases.aspx?ReleaseId=16449

قام هانسلمان بالتدوين حول هذا الموضوع مؤخرًاhttp://www.hanselman.com/blog/ASPNETFuturesGeneratingDynamicImagesWithHttpHandlersGetsEasier.aspx

@ ويل وبن جريسوالد:بدلاً من "image.aspx" استخدم "image.ashx".

إنها خفيفة الوزن أكثر من صفحة ASP.Net الكاملة، وهي مصممة خصيصًا للتعامل مع أنواع المحتوى بخلاف النص/html.

على الرغم من أن ربط Databinding MemoryStream بصورة غير ممكن، فمن الممكن استخدام Label/GenericControl، وبعض التعليمات البرمجية و مخطط URI للبيانات لتضمين الصور في الصفحات، ولكن هناك مشكلات خطيرة تتعلق بهذا الأسلوب:

سلبيات

  • يجب استخراج المحتوى المضمن وفك تشفيره قبل إجراء التغييرات، ثم إعادة ترميزه وإعادة تضمينه بعد ذلك.
  • ملفات تعريف الارتباط غير مدعومة.
  • يتم إعادة تنزيل المعلومات التي تم تضمينها أكثر من مرة كجزء من الملف الذي يحتوي عليها، وبالتالي لا تستفيد من ذاكرة التخزين المؤقت للمتصفح.
  • قد تحدد المتصفحات أطوال URI، مما يؤدي إلى إنشاء حد أقصى فعال لحجم البيانات.على سبيل المثال، كان لعناوين URI في الإصدارات السابقة من Opera حدود 4 كيلو بايت، و32 كيلو بايت لـ IE8 Beta 1.
  • يتم تضمين البيانات كتدفق بسيط، وقد لا تدعم العديد من بيئات المعالجة (مثل متصفحات الويب) استخدام الحاويات (مثل الأجزاء المتعددة/البديلة أو الرسالة/rfc822) لتوفير تعقيد أكبر مثل بيانات التعريف أو ضغط البيانات أو التفاوض على المحتوى.
  • مايكروسوفت إنترنت إكسبلورر، من خلال الإصدار 7 (حوالي 70٪ من السوق اعتبارًا من الربع الثاني من عام 2008)، يفتقر إلى الدعم.

الطريقة الأفضل هي استخدام صفحة "Image.aspx" منفصلة تأخذ وتخرج MemoryStream الخاص بك، كما فعلت في برنامج ألبوم الصور الخاص بي الذي قمت بإنشائه عندما بدأت تعلم ASP.net:

(لا تضحك، كانت تلك محاولتي الأولى في استخدام ASP.net :-)

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

يمكنك استخدام عنصر التحكم BinaryImage الخاص بـ Telerik لـ ASP.net.

مزيد من المعلومات هنا:http://www.telerik.com/products/aspnet-ajax/binaryimage.aspx

لا.

ولكن يمكنك إنشاء صفحة خاصة لدفق تلك الصورة.أولاً، تقوم بتعيين عنوان URL للصورة على الصفحة التي تقوم بالبث، بما في ذلك بعض معلمات عنوان URL التي تتيح لك معرفة مكان الحصول على الصورة:

<img src="GetImage.aspx?filename=foo" ... />

في GetImage.aspx، يمكنك الحصول على اسم الملف (أو أي شيء آخر) من عنوان URL، وتحميل الصورة في MemoryStream، ثم كتابة محتوى دفق الذاكرة هذا مباشرة إلى HttpResponse:

    response.Expires = 0;
    response.Buffer = false;
    response.Clear();
    response.ClearHeaders();
    response.ClearContent();
    response.ContentType = "image/jpeg";
    response.BinaryWrite(stream);
    response.Flush();
    response.Close();

بالنسبة لي كان من الضروري إضافة "buffer = "false" إلى @Page.وإلا فإنني سأظل أحصل على نفس الصورة طوال الوقت ...

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top