4

私がまとめたオンラインストアに来る各製品の10〜30枚の画像を含む100(おそらく1000)の製品があります。画質を落とさずに、画像のファイル サイズをできるだけ最適化する必要があります。

jpegtran、jpegoptim、またはその他の jpeg オプティマイザーを直接使用したことはありませんが、punypng は大きな jpeg 画像でファイル サイズを約 4 ~ 6% 縮小することに気付きました。

メタデータは、アップロード中に (jumpodader を介して) 画像から既に取り除かれているため、これはオプション/問題ではなくなりました。

jpeg オプティマイザーの 1 つを C# コードから実行する方法はありますか?

注: IIS7 および .Net 3.5 で共有の Godaddy ホスティングを使用しています。

4

5 に答える 5

2

一時ファイルをいじりたくない場合は、C ++/CLIを使用することをお勧めします。

VisualStudioでC++/CLIdllプロジェクトを作成します。静的管理クラスを1つ作成し、C#から使用する関数を定義します。

public ref class JpegTools
{
public:
     static array<byte>^ Optimize(array<byte>^ input)
};

定義するこれらの関数は、C#から直接呼び出すことができ、C++が提供するすべてのものを使用して実装できます。

array ^はC#バイト配列に対応します。pin_ptr <>を使用してバイト配列をメモリに固定する必要があります。これにより、選択したアンマネージJpegヘルパー関数にデータを渡すことができます。C ++ / CLIは、マネージ型をネイティブ型にマーシャリングするための十分なサポートを備えています。gc_newを使用して新しい配列を割り当て、CLI互換タイプを返すこともできます。この演習の一環として文字列をC#からC ++にマーシャリングする必要がある場合は、Mfc/AtlのCString型を使用してください。

すべてのjpegコードをdllに静的にリンクできます。C ++ dllは、純粋なネイティブコードとC ++/CLIコードを混在させることができます。私たちのC++/ CLIプロジェクトでは、通常、インターフェイスソースファイルのみがCLIタイプを認識し、残りはすべてC++タイプで機能します。

この方法を実行するにはいくつかのオーバーヘッド作業がありますが、利点は、コードがコンパイル時に型チェックされ、管理されていないコードとメモリの処理がすべてC++側で処理されることです。実際には非常にうまく機能するので、C ++/CLIを使用してネイティブC++コードをNUnitでほぼ直接単体テストしました。

幸運を!

于 2009-10-12T18:35:26.000 に答える
1

画像を提供しながら処理するのではなく、Web サーバーにアップロードする前に画像をバッチ処理します。これにより、Web サーバーの負荷が軽減され、任意の一致画像処理ツールを使用できるようになります。

于 2009-10-12T11:33:50.610 に答える
-1

Process.Start()で punypng.com を呼び出さないのはなぜですか? 処理がアップロード時に行われる場合 (画像の提供時ではなく)、.net コードで外部プログラムを実行できない理由はありません。

例えば

  • 「アップロード」フォルダにアップロードし、
  • 「アップロード」フォルダー内の新しいファイルを監視する Windows サービスがある
  • 新しいファイルを取得したら、punypng.com を起動して処理し、出力を正しい画像フォルダーに入れます。
于 2009-10-12T13:47:31.230 に答える