2009-04-16 12 views
2

私はASP.NETで通常のギャラリーを作成していますが、サムネイルの作成に関する経験はほとんどありません。私はアルゴリズムとGetThumbnailImageメソッドを知っていますが、私の問題はどこかにあります。ImageButtonコントロールを使ってイメージを表示しています。それがポイントです - 私はImageUrlプロパティに "サムネイル"画像をフックアップする方法がわかりません。それは可能でもあり、そうなら、どうですか?代わりに他のコントロールを使用する必要がありますか?何か提案ありがとう!ASP.NETでサムネイルを表示する最適な方法は何ですか?

答えて

5

イメージリクエストを処理し、サムネイルを返すHttpHandlerを作成できます(イメージ上に必要なものは何でも構いません)。あなたはASP.NETでのグラフィックスものを行うたび

、ほとんどSystem.Drawingのすべては、GDI +のラッパーであるとthetreforeを適切に配置する必要がアンマネージメモリへの参照を保持している心に留めておく(usingステートメントを使用します) 。これは、StringFormatなどの単純なクラスの場合でも当てはまります。

+0

ありがとう、私はそれを試してみましょう! – jkottnauer

+1

イメージをキャッシュするようにしてください。これは、おそらくすべてのイメージを拡大縮小しないためです。 –

+0

右。あまりにも動的ではなく、ASP.NETで複雑なものを計算するのは、通常は良い考えです... – Lucero

6

HttpHandlerを設定する必要があるようですが、リサイズされたイメージが作成され、おそらくディスクにもキャッシュされるように思えます要求。

ので、例えば:

<asp:ImageButton ID="ImageButton1" ImageUrl="~/ImageHandler.ashx?ImageId=123" runat="server /> 

その後、ハンドラを持っているでしょう:

namespace MyProject 
{ 
    public class ImageHandler : IHttpHandler 
    { 
     public virtual void ProcessRequest(HttpContext context) 
     { 
      // 1. Get querystring parameter 
      // 2. Check if resized image is in cache 
      // 3. If not, create it and cache to disk 
      // 5. Send the image 

      // Example Below 
      // ------------- 

      // Get ID from querystring 
      string id = context.Request.QueryString.Get("ImageId"); 

      // Construct path to cached thumbnail file 
      string path = context.Server.MapPath("~/ImageCache/" + id + ".jpg"); 

      // Create the file if it doesn't exist already 
      if (!File.Exists(path)) 
       CreateThumbnailImage(id); 

      // Set content-type, content-length, etc headers 

      // Send the file 
      Response.TransmitFile(path); 
     } 

     public virtual bool IsReusable 
     { 
      get { return true; } 
     } 
    } 
} 

あなたはまた、web.configファイル

<system.web> 
    <httpHandlers> 
     <add verb="*" path="ImageHandler.ashx" type="MyProject.ImageHandler, MyProject"/> 
    </httpHandlers> 
</system.web> 

でこれを設定する必要があるだろうこれは、あなたを始めさせるのに十分なはずです。サムネイルを作成するには、ProcessRequestメソッドを変更する必要がありますが、すでにこれを処理したことに言及しました。また、ファイルをブラウザに送信するときにヘッダーを正しく設定する必要があります。

+1

をご確認ください。小さな変更...あなたはcontext.Response.TransmitFile(path);を呼び出す必要があります。 –

1

Httpハンドラが方法です。

パフォーマンスに関するもう1つの注意:イメージを操作することは、メモリとCPUの両方の観点からディスク容量に比べて高価です。したがって、完全な画像からサムネイルを生成することは、それぞれの完全な画像に対して1回だけしたいことです。それを行うには、おそらく、画像がアップロードされた時点で、特に複数の画像を同じページに表示することになります。

関連する問題