5

ストリームから取得した byte[] 画像からサムネイルを作成したいと思います。DecodePixelWidth または ScaleTransform の 2 つのオプションがあります。

私の質問:

  1. どちらが速いですか?
  2. より適切な方法はどれですか?
  3. 彼らはそれぞれ何をしますか?
  4. メモリ/CPUの使用量が少ないのはどれですか?

初め:

私はこの方法を好みます。わずかに多くのメモリを使用しますが、より高速なようです。しかし、なぜですか?Matrix を使用し、GPU を使用して作業を行っていますか? その場合、顧客は私と同じように速くできる場合とできない場合があります。

using (var stream = new MemoryStream(rasterizedPage.ImageData, false))
{
    var bitmap = DocHelper.ConvertToBitmapImage(stream);
    var transform = new ScaleTransform(0.1, 0.1);
    var thumbnail = new WriteableBitmap(new TransformedBitmap(bitmap, transform));

    byte[] byteImage = DocHelper.ConvertToBytes(thumbnail);

    return byteImage;
}

2番:

この方法はメモリ使用量は少ないですが、遅く見えますし、画像はぼやけていますが、サムネイルなので問題ありません。それでも、ScaleTransform の方が優れていますか?

using (var stream = new MemoryStream(rasterizedPage.ImageData, false))
{
    byte[] byteImage;
    var bitmap = new BitmapImage();
    bitmap.BeginInit();
    bitmap.DecodePixelWidth = 120;
    bitmap.StreamSource = stream;
    bitmap.EndInit();
    bitmap.Freeze();
    byteImage = DocHelper.ConvertToBytes(bitmap);

    return byteImage;
}

ご協力ありがとうございました。

4

1 に答える 1

4

いくつかの調査の後、私はこの結論に達しました。

スケール変換:

これによると、ScaleTransform変換行列を使用してポイントを計算します。などの特徴もあります。

Freezable Features : ScaleTransform オブジェクトは、リソースとして宣言したり、複数のオブジェクト間で共有したり、パフォーマンスを向上させるために読み取り専用にしたり、複製したり、スレッドセーフにすることができます。

また、DecodePixelWidth とは異なり、ScaleTransform を使用して回転、反転、ミラー イメージの作成などを行うこともできます。これらのを見てください。

いつ使用するか:

  1. 画像を回転します。
  2. 画像のサイズを変更します。
  3. 画像を反転します。
  4. ミラー イメージを作成します。
  5. スレッドを使用するアプリケーション。
  6. 画像をリソースとして使用する。

使用しない場合:

  1. 画像を大きくしすぎる。壊れます。アプリケーションが大量のメモリを使用すると、メモリ例外が発生します。ここを見てください。

DecodePixelWidth :

DecodePixelWidthは、画像のサイズを変更する別のオプションです。唯一の問題は、JPEG/PNG コーデックのみを扱うように見えることです。

JPEG および Portable Network Graphics (PNG) コーデックは、画像を指定されたサイズにネイティブにデコードします。他のコーデックは、画像を元のサイズでデコードし、画像を目的のサイズにスケーリングします。

実際、他の種類の画像で使用しようとすると、奇妙な動作が発生します。XAML で幅を変更したほうがよいでしょう。さらに、JPEG/PNG コーデック以外の形式を使用すると、画像が歪みます。私には、他の形式では元のサイズで画像をデコードするため、ピクセルが近づきすぎて画像が歪む可能性が高いようです。

いつ使用するか:

  1. JPEG/PNG コーデック内の画像。
  2. 大きな画像を小さな画像にサイズ変更して、メモリを節約します。

使用しない場合:

  1. 画像が JPEG/PNG とは異なるコーデックを使用している場合。

結論

これらは、画像のサイズを変更する 2 つの異なる方法にすぎませんが、ScaleTransform には他の機能があり、より適したオプションであるという点が異なります。

于 2015-02-14T17:03:41.067 に答える