ASP.NETで通常のギャラリーを作成していますが、サムネイルの作成の経験はほとんどありません。アルゴリズムとGetThumbnailImageメソッドは知っていますが、問題は別の場所にあります。現在、ImageButtonコントロールを使用して画像(サイズを変更したばかり)を表示しています。そして、それがポイントです。「サムネイル」画像をImageUrlプロパティに接続する方法がわかりません。それも可能ですか、もしそうなら、どのように?または、代わりに他のコントロールを使用する必要がありますか?提案をありがとう!
3 に答える
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メソッドを変更する必要がありますが、これはすでに処理済みであるとおっしゃいました。また、ファイルをブラウザに送信するときに、ヘッダーが正しく設定されていることを確認する必要があります。
画像リクエストを処理してサムネイルを返す(または画像に対して必要なことをすべて実行する)HttpHandlerを作成できます。
ASP.NETでグラフィックス処理を行う場合は常に、System.DrawingのほとんどすべてがGDI +のラッパーであるため、適切に破棄する必要があるアンマネージメモリへの参照を保持することに注意してください(using
ステートメントを使用してください)。これは、StringFormatなどの単純なクラスにも当てはまります。
Httpハンドラーは行く方法です。
パフォーマンスに関するもう1つの注意事項:イメージの操作は、メモリとCPUの両方の観点から、ディスク容量に比べてコストがかかります。したがって、完全な画像からサムネイルを生成することは、完全な画像ごとに1回だけ実行したいことです。これを行うのに最適なタイミングは、おそらく画像がアップロードされたときです。特に、同じページにこれらの画像を多数表示する場合はなおさらです。