[ソリューション]自動調整画像

5085 ワード

  • プロジェクトソース
  • 原因:画像のサイズ/サイズが異なり、規則がなく、全部で300以上のG
  • がある.
  • ターゲット
  • は、既存のプログラムやアーキテクチャをできるだけ修正することなく、PC時代のピクチャライブラリをモバイル端末
  • に最小の代価で適応させる.
  • 遡及(ソースファイルに対応する)
  • 制御可能(事前定義されたルールで、1つのリクエストが勝手に入っても処理されるわけではない)
  • は、2回目(処理済みの場合は、直接出力、そうでない場合は、次回の要求のために直接使用するために処理して保存する)
  • を処理しない.

    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
    
  • 第1種は、ファイル名と拡張子との間にプレースホルダautoとルールs1とを挿入する.ソースファイルのアドレスを取得した後、このようなフォーマットに処理するには、不便です(それだけです)
  • 第2種は強挿がないが、接尾辞が多くなった.これのデメリットは多くなりますが、
  • まず、疑問符と疑問符がないものは同じファイルを表し、特にソース図と新しい図を同時に表示する場合、問題はさらに際立っている.
  • Windowsでは、疑問符(?)はファイル名に表示できません(Linuxではテストがないのでわかりません).これは第4条の目標に背いている.

  • 第3種は多く言わないで、あまりにもLOWで、考慮の範囲内ではありません.

  • 以上より、ここでは第1のアクセス方式を選択する.しかし、このような方法を使うには、少し困っています.入り口がないからです.

    入り口を与える


    静的タイプのファイル、ASP.NETのデフォルトはプログラム処理されません.GlobalBeginRequestにブレークポイントを設定して、入ることができるかどうかを見ることができます.プログラムが静的ファイルを処理できるようにするには、web.configに次の構成を追加する必要があります.
    
      
      
        
        
        
        
      
    
    

    これで、GlobalBeginRequestに処理プログラムを書くことができます.

    さらに一歩進む

    VirtualPathProviderVirtualFileの2つのものの使い道はとても多くて、知らないので、自分で検索することができます.私の知っていることも多くありませんが、ずっと前にdllのマスターページを取り出しただけです.ここでは画像リクエストを処理します.
  • まず、GlobalApplication_StartVirtualPathProvider:
    HostingEnvironment.RegisterVirtualPathProvider(new  VImgProvider(baseDir));
    
    VImgProviderソースコード
  • を登録する.
  • の要求が入ると、まずVImgProvider.FileExistsの方法になるが、ここでは主に入力要求が許容可能なピクチャタイプであるか、ターゲットファイルが存在するかを判断する.
  • 次いでVImgFile.Openメソッドソースコードに進む
  • は、要求するファイルが存在するか否かを判断し、存在する場合は、直接返す.
  • が存在しない場合は、入る要求が設定のルールを満たすか否かを判断する.
  • ルールを満たす場合、要求から のパスを分割/解析/アセンブリする.
  • が存在する場合は、 を規則的にスケーリングし、結果を同じディレクトリに保存する.
  • 同様の要求が2回目に入ってきて、1歩目まで歩くだけで戻ることができる.


  • に付随


    修正ルールを簡単に追加するために、ホットスワップの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を追加する必要があります
  • Microsoft.Extensions.FileProviders.Composite
  • Microsoft.Extensions.FileProviders.Phyical

  • 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は質量パーセントをサポートしない.