[ソリューション]自動調整画像
5085 ワード
ASP.NETとNETCoreの解決方法は異なる.本文は二つの部分に分かれている.
ASP.NET
仮想ファイル解析は、VirtualFile
/VirtualPathProvider
およびStaticFileHandler
により行う.
遡及
遡及の最も簡単な方法は
と
であり、
は1つの至を維持する.そして
は、ルールをファイル名に追加しなければならない.以上の2点を総合すると、以下のアクセス方法を比較できます. : http://www.baidu.com/imgs/2017/09/09/abc.jpg
1. http://www.xxx.com/imgs/2017/09/09/abc.auto.s1.jpg
2. http://www.xxx.com/imgs/2017/09/09/abc.jpg?100x100
3. http://www.xxx.com/img?source=/imgs/2017/09/09/abc.jpg&w=100&h=100
: http://www.baidu.com/imgs/2017/09/09/abc.jpg
1. http://www.xxx.com/imgs/2017/09/09/abc.auto.s1.jpg
2. http://www.xxx.com/imgs/2017/09/09/abc.jpg?100x100
3. http://www.xxx.com/img?source=/imgs/2017/09/09/abc.jpg&w=100&h=100
auto
とルールs1
とを挿入する.ソースファイルのアドレスを取得した後、このようなフォーマットに処理するには、不便です(それだけです)?
)はファイル名に表示できません(Linuxではテストがないのでわかりません).これは第4条の目標に背いている.以上より、ここでは第1のアクセス方式を選択する.しかし、このような方法を使うには、少し困っています.入り口がないからです.
入り口を与える
静的タイプのファイル、ASP.NETのデフォルトはプログラム処理されません.
Global
のBeginRequest
にブレークポイントを設定して、入ることができるかどうかを見ることができます.プログラムが静的ファイルを処理できるようにするには、web.config
に次の構成を追加する必要があります.
これで、
Global
のBeginRequest
に処理プログラムを書くことができます.さらに一歩進む
VirtualPathProvider
、VirtualFile
の2つのものの使い道はとても多くて、知らないので、自分で検索することができます.私の知っていることも多くありませんが、ずっと前にdllのマスターページを取り出しただけです.ここでは画像リクエストを処理します.Global
のApplication_Start
にVirtualPathProvider
:HostingEnvironment.RegisterVirtualPathProvider(new VImgProvider(baseDir));
VImgProvider
ソースコードVImgProvider.FileExists
の方法になるが、ここでは主に入力要求が許容可能なピクチャタイプであるか、ターゲットファイルが存在するかを判断する.VImgFile.Open
メソッドソースコードに進む
のパスを分割/解析/アセンブリする.
が存在する場合は、
を規則的にスケーリングし、結果を同じディレクトリに保存する.に付随
修正ルールを簡単に追加するために、ホットスワップのJsonConfigを定義しました.
Cfgs/SizeTypes.json
を変更するだけです.例:{
"Types": [
{
"name": "s1",
"width": 100,
"height": 100,
"quality": 70
},
{
"name": "s2",
"width": 200,
"height": 200,
"quality": 70
},
{
"name": "s3",
"width": 113,
"height": 128
}
]
}
もちろん、新しい構成を適用するには、生成された画像を手動で削除する必要があります.
NETCore
StaticFileミドルウェアのFileProviderを修正することで実現する.
相対的に、NETCoreの実現は簡単である:StaticFileMiddlewareのFileProviderを修正するだけでよい.var ap = new AutoImgFileProvider(this.Configuration);
// WebRootFileProvider , , AutoImageFileProvider .
var cp = new CompositeFileProvider(env.WebRootFileProvider, ap);
var opt = new StaticFileOptions()
{
FileProvider = cp
};
app.UseStaticFiles(opt);
Nugetを追加する必要があります
var ap = new AutoImgFileProvider(this.Configuration);
// WebRootFileProvider , , AutoImageFileProvider .
var cp = new CompositeFileProvider(env.WebRootFileProvider, ap);
var opt = new StaticFileOptions()
{
FileProvider = cp
};
app.UseStaticFiles(opt);
AutoImgFileProviderは、
PhyicalFileProvider
を継承するのではなく、包装しています.要求を受けた場合(GetFileInfo
)、まずパッケージのPhyicalFileProvider.GetFileInfo
を呼び出し、ターゲットが存在する場合、直接戻る.そうでなければ、ASP.NETの流れは同じです:分割/解析/組み立て/保存して、それから戻ります.に付随
NETCoreルール構成は独立したプロファイルを採用しており、ルールを修正するには、変更するだけです:AutoImg.jsonの例:
{
"AutoImg": {
"BaseDir": "d:\\Imgs",
"Types": [
{
"name": "s1",
"width": 100,
"height": 100
},
{
"name": "s2",
"width": 200,
"height": 200
},
{
"name": "s3",
"width": 113,
"height": 128
}
]
}
}
別添
NETCoreでの画像処理はImageSharp,NET FXではImageProcessorを用いる.ImageSharpは質量パーセントをサポートしない.