2

Guido Vollbeding という男が提案した実装を聞いたので、できるだけ損失が少ないことを願っています。標準の GDI+ にはこの機能がないようです。これまでに見つけたのは、仕様または完全に統合されたツールのいずれかです。スリムでプラグ可能な .NET コンポーネントが非常に望ましいでしょう。自分で実装した場合の一般的な落とし穴は何ですか?

すべてのアイデアとガイダンスは大歓迎です!

編集:私の目的は、.NETビットマップに解凍し、そこでサイズを変更してから再度圧縮するという明らかなサイクルをバイパスすることです。この記事は正しい方法を指しているように見えますが、これまでのところ、.NET の実装を見たことがありません。

4

3 に答える 3

2

これは、.NET Bitmap クラスを使用すると非常に簡単です。

void ResizeImage(string inFname, string outFname, float scale)
{
    Bitmap bmpOrig = new Bitmap(inFname);
    int w = (int)(scale * bmpOrig.Width);
    int h = (int)(scale * bmpOrig.Height);
    Bitmap bmpNew = new Bitmap(bmpOrig, new Size(w, h));
    bmpNew.Save(outFname, ImageFormat.Jpeg);
}

System.Drawing への参照を追加し、コードで System.Drawing と System.Drawing.Imaging の両方を使用する必要があります。

どのくらいの損失になるかは言えません。

于 2009-01-22T04:50:17.753 に答える
0

1/(2^n) を具体的に処理するアルゴリズムは知りませんが、それを見つけることができれば、ビットマップ上のビットをロックできる必要があります (合理的な形式の速度が必要な場合)。set/get pixel を使用するのはお勧めできません。

クリック感

于 2009-01-22T05:17:44.703 に答える
0

それをビットマップとしてメモリにロードし、そのデータを取得して、C++ のように記述されたアンセーフ コードを使用してサイズを変更します。ここで、画像のサイズをすばやく変更する方法を学びました (リンクで画像のサイズが変更されるとは思いませんが、.Net で高速な画像処理コードを作成する方法を示しています)。

[逆アセンブル] ウィンドウでブレークポイントを設定し、コードをステップ実行すると、実行状況がわかります。配列へのアクセスは一切避け、ポインターのみを使用してください。配列へのアクセスは、.Net のタイトなパフォーマンス ループにとって死のキスです (インデックスが境界内にあるかどうかのチェックと、Every の例外をスローするための条件付きジャンプがあるため)。 。 アクセス。)

于 2011-05-11T19:40:07.127 に答える