簡単にするために、画像のサムネイルを表示する必要があるWebページがあるとします。画像の場所はデータベースに保存されます(画像はAmazon S3に保存されます)。クライアントに配信する前に、Webサーバーで大きな画像を縮小することはできますか?このように、すべての画像のサムネイルを保存する必要はなく、クライアントはより小さなファイルをダウンロードできます。
4 に答える
このトピックに関するすべてのチュートリアルは状況を過度に単純化し、それらのほとんどすべてがメモリをリークします。長い間読んでいますが、29の画像サイズ変更の落とし穴について知っておく必要があります。そうすれば、それらを回避できます。
サーバー側の動的画像のサイズ変更を安全に行うためのライブラリを作成しました。これは、1つのチュートリアルまたは10でさえ適切に実行できるものではありません。バグの80%は解決できますが、100%は解決できません。そして、このようなリソースを大量に消費する何かをしているときは、バグやメモリリークを許容できません。
コアライブラリは無料でオープンソースですが、AmazonS3プラグインはPerformanceエディションの一部であり、249ドルのライセンス料がかかります。Performance Editionには、S3、MS SQL、Azure、MongoDB GridFS、CloudFront統合のソース、例、ドキュメント、およびテラバイト規模のディスクキャッシングとmemcachingが付属しています。
私がアクセスできる統計から、imageresizing.netはこの種のライブラリの中で最も広く使用されているようです。少なくとも5つのソーシャルネットワークを実行し、最大20TBの画像コレクションで使用されます。ローカルストレージ(またはSAN)はあまりスケーラブルではないため、ほとんどの大規模サイトではS3プラグインを使用しています。
もちろん問題ありません。データベースから画像をディッシュする方法を示すリソースがWeb上にたくさんあります。したがって、ここではそれを複製しません。
画像を読み込んだら、.NETを使用して簡単に縮小できます。次のURLに例があります。それはあなたがしていることを正確には行いませんが、画像のサムネイルを生成します。
http://blackbeltcoder.com/Articles/graphics/creating-website-thumbnails-in-asp-net
WebImage
入ってくるクラスを使用してSystem.Web.Helpers.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();
}
詳細はこちら:ASP.NETMVCを使用してオンザフライで画像のサイズを変更する
WebImage
これは、ASP.NETサイトから直接操作する方法を示す優れたチュートリアルです。
はい。
Response.Clear()を実行し、ResponseにContent-Type-headerを設定し、画像のバイナリデータを(これもResponseを介して)送信するASP.Netページを作成します。画像はオンザフライでサイズ変更できますが、しばらくの間ディスクなどにキャッシュすることをお勧めします。次に、HTMLからの画像を<img src ="http://server/yourimagepage.aspx">として参照します。送信する前に画像をメモリに保存するには、MemStreamを使用できます。
サンプルコードはありますが、今は目の前にありません。ごめんなさい。:)