2011-01-07 10 views
2

簡単にするために、画像のサムネイルを表示する必要のあるWebページがあるとします。イメージの場所はデータベースに保存されます(イメージはAmazon S3に保存されます)。クライアントに配信される前に大規模なイメージを縮小することは可能ですか?こうすることで、すべてのイメージのサムネイルを保存する必要がなくなり、クライアントはより小さなファイルをダウンロードできます。asp.netで画像のサイズを変更する

+0

ただ、完全な画像を常に転送する必要があることに注意することは、唯一の違いは、ワイヤの下にそれを引っ張っされます誰です。つまり、イメージ操作を行うことができる 'HttpHandler'を実装することができます。 –

+2

あなたのイメージはS3上にあると言います - あなたのアプリケーションは単一のサーバー上で動作しているのですか、それともクラウドアプリケーションですか?大規模な画像を読み込んでサイズを変更するには、単一のサーバーでアプリを実行している場合には必ずしも必要ではない、かなりのオーバーヘッドがあります。まだ作成されていないサムネイルを作成してディスクに保存するだけで、サムネイルが変更されない限りイメージ上でコードを再実行する必要はありません。 – BenAlabaster

+0

[ImageResizing.Net](http://imageresizing.net)プロジェクトでは、S3イメージのサイズ変更とディスクキャッシュの両方を提供しています。 –

答えて

1

もちろん、問題ありません。 Web上には、データベースから画像を整理する方法を示す豊富なリソースがあります。だから私はここでそれを複製しません。

イメージをロードしたら、.NETを使用してイメージを簡単に縮小できます。次のURLに例があります。あなたがやっていることを正確にはしませんが、イメージのサムネイルを生成します。

http://blackbeltcoder.com/Articles/graphics/creating-website-thumbnails-in-asp-net

0

はい。

Response.Clear()を実行するASP.Netページを作成し、レスポンスにContent-Type-headerを設定し、イメージのバイナリデータを(Responseを介して)送信します。イメージはオンザフライでサイズ変更することができますが、ディスクなどにしばらくの間キャッシュすることをおすすめします。次に、画像をHTMLから< img src = "http://server/yourimagepage.aspx" >という名前で参照します。送信前にメモリに画像を保存するには、MemStreamを使用できます。

私はサンプルコードを持っていますが、私の目の前にはありません。申し訳ありません。 :)

9

このトピックに関するすべてのチュートリアルでは状況が過度に簡素化され、ほぼすべてがのリークメモリです。それは長い読書ですが、you should know about the 29 image resizing pitfallsを避けることができます。

I wrote a library to do server-side dynamic image resizing safely。 1つのチュートリアルや10で正しく実行できるものではありません。バグの80%は解決できますが、100%は解決できません。このリソースを大量に消費する何かをしていると、バグやメモリリークを許容することができません。

コアライブラリはフリーでオープンソースですが、Amazon S3プラグインはPerformance editionの一部で、ライセンス料は249ドルです。 Performance Editionには、S3、MS SQL、Azure、MongoDB GridFS、CloudFrontの統合、テラバイトスケールのディスクキャッシングとmemcachingのソース、サンプル、ドキュメントが付属しています。

私がアクセスしている統計から、imageresizing.netはその種のライブラリとして最も広く使われているようです。それは少なくとも5つのソーシャルネットワークを実行し、20TBもの大きさの画像収集に使用されます。ほとんどの大規模サイトではS3プラグインが使用されていますが、ローカルストレージ(またはSAN)はスケーラビリティがあまり高くありません。

+2

+1 for imageresizing.net - フル機能、高速、セットアップが容易で、拡張性があり、手頃な価格です。とにかくバグにぶつかるでしょう。 – jaminto

1

これはSystem.Web.Helpers.WebImageにあるWebImageクラスを使用すると実現できます。

この素晴らしい子供を使って、サイズ変更された画像を即座に出力できます。

サンプルコード:ここではそれについて

public void GetPhotoThumbnail(int realtyId, int width, int height) 
{ 
    // Loading photos’ info from database for specific Realty... 
    var photos = DocumentSession.Query<File>().Where(f => f.RealtyId == realtyId); 

    if (photos.Any()) 
    { 
     var photo = photos.First(); 

     new WebImage(photo.Path) 
      .Resize(width, height, false, true) // Resizing the image to 100x100 px on the fly... 
      .Crop(1, 1) // Cropping it to remove 1px border at top and left sides (bug in WebImage) 
      .Write(); 
    } 

    // Loading a default photo for realties that don't have a Photo 
     new WebImage(HostingEnvironment.MapPath(@"~/Content/images/no-photo100x100.png")).Write(); 
} 

より:Resize image on the fly with ASP.NET MVC


ここでASPから直接WebImageと連携する方法を示しています素晴らしいチュートリアルです。NETサイト:

Working with Images in an ASP.NET Web Pages (Razor) Site

関連する問題