2008-09-05 28 views
13

MemoryStreamをasp:imageコントロールにバインドする方法はありますか?MemoryStreamをasp:imageコントロールにバインドするには?

+0

ここで詳細情報http://imageresizing.net HttpModuleは非常に簡単になります。 –

+0

皆さんのお返事ありがとうございます。私もこの問題にhttphandlerを使用しましたが、それ以上は必要です。httphandlerにパラメータを渡して、別のイメージをグリッドに追加すると、その行のIDによってその差が提供されるので、このhttphandlerにパラメータを渡す必要があります。便利ですか?提案がありますか? –

答えて

7

ハンドラを他の要求のようなURLパラメータを受け入れることができます。したがって、<asp:image/>image.ashxにリンクする代わりに、image.ashx?ImageID=[Your image ID here]に設定してください。

+0

そして、http://imageresizing.netライブラリがそれを行います。 –

40

画像を返すHttpHandlerを作成することをお勧めします。次に、asp:ImageのImageUrlプロパティをHttpHandlerのURLにバインドします。

ここにいくつかのコードがあります。

まずの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); 
    } 
} 

次に、ちょうどあなたがASPを使用しているあなたのaspxページ内で呼び出す:イメージ。

<%@ 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> 

これだけです。画像へのMemoryStreamをデータバインディングすることはできませんが、私が想定しています

+0

HttpHandlerなしでこれを行う方法はありますか?私のプロジェクトにハンドラを作成するための書き込みはありません。 ' –

1

それについてブログ運があるかもしれない asp.netからの動画像を生成する必要がありますLabel/GenericControl、いくつかのコード、data URI schemeを使用してPagesに画像を埋め込むことは可能ですが、そのアプローチには深刻な問題があります:

欠点

  • 変化が再エンコードし、その後、埋め込み再次に、作製され得る前に埋め込まれたコンテンツを抽出して復号化しなければなりません。
  • Cookieはサポートされていません。
  • 複数回埋め込まれている情報は、ファイルを含むファイルの一部として再ダウンロードされるため、ブラウザのキャッシュのメリットはありません。
  • ブラウザはURIの長さを制限し、有効な最大データサイズを作成することがあります。例えば、以前のバージョンのOperaのURIはIE8ベータ1の場合、4kBと32kBの制限がありました。
  • データは単純なストリームとして含まれており、多くの処理環境(Webブラウザなど)はコンテナの使用をサポートしていない場合があります(multipart/alternativeまたはmessage/rfc822など)を使用して、メタデータ、データ圧縮、またはコンテンツネゴシエーションなどの複雑性を高めることができます。
  • マイクロソフトのInternet Explorerは、バージョン7(2008年第2四半期の市場の約70%)をサポートしていません。

より良いアプローチは、私はASP.netの学習を始めたとき、私が作成した私のフォトアルバムソフトでやったちょっとのように、あなたのMemoryStreamを取り、出力別の「Image.aspx」ページを使用することです:

(Don't laugh, that was my first attempt at ASP.net :-)

編集:ASHXに合意した、上記のコードは、ちょうど1つのサンプル実装を示すことです。私がフォトアルバムを更新するために来るとき、それはASHXを使用します。

2

@WillとBen Griswald: "image.aspx"の代わりに "image.ashx"を使用してください。

ASPよりも軽量です。Net Pageであり、text/html以外のコンテンツタイプを扱うように特別に設計されています。

0

いいえ。

しかし、特別なページを作成してその画像をストリーミングすることができます。まず、あなたはどこの画像を取得する知っているいくつかのURLパラメータを含むストリーミングを行い、ページに画像のURLを設定します。GetImage.aspxで

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

は、ファイル名を取得する(または任意の)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(); 
0

...

関連する問題