2

重複の可能性:
画像のサイズを変更してフォルダに保存する方法は?

サイズを変更して、特定のフォルダに画像として保存したいと思います。しかし、私は可能な限り最高の品質でそれをやりたいです。サードパーティのソフトウェアを使用したいと思っています。

paint.netやphotoshopのように。

では、これを達成するための最良の方法は何ですか?

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

4

3 に答える 3

3

免責事項: 次のリンク/コードは私のブログからのものです。

私のサイトのこの投稿を見てください http://samuelhaddad.com/2011/01/26/net-high-quality-thumbnail-generation/

投稿のコードは次のようになります。

//Image Resize Helper Method
private static Bitmap ResizeImage(String filename, int maxWidth, int maxHeight)
{
    using (Image originalImage = Image.FromFile(filename))
    {
        //Caluate new Size
        int newWidth = originalImage.Width;
        int newHeight = originalImage.Height;
        double aspectRatio = (double)originalImage.Width / (double)originalImage.Height;
        if (aspectRatio <= 1 && originalImage.Width > maxWidth)
        {
            newWidth = maxWidth;
            newHeight = (int)Math.Round(newWidth / aspectRatio);
        }
        else if (aspectRatio > 1 && originalImage.Height > maxHeight)
        {
            newHeight = maxHeight;
            newWidth = (int)Math.Round(newHeight * aspectRatio);
        }
        Bitmap newImage = new Bitmap(newWidth, newHeight);
        using (Graphics g = Graphics.FromImage(newImage))
        {
            //--Quality Settings Adjust to fit your application
            g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBilinear;
            g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
            g.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.HighQuality;
            g.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;
            g.DrawImage(originalImage, 0, 0, newImage.Width, newImage.Height);
            return newImage;
        }
    }
}

バッチ処理のために for ループでラップできます。

于 2012-12-05T20:55:22.433 に答える
1

編集:実際には、以下で説明する情報のタイプのより良いプレゼンテーションと説明については、このライブラリこの記事を参照してください。

しかし、ほとんどの画像ライブラリには lanczos が用意されていると思います。ほとんどまともな C# ラッパーを持っているように見える FreeImageを使用しました。


品質は主に、使用される補間アルゴリズムとサイズ変更の比率に関するものです。Paint.net と Photoshop には、それらを選択するためのドロップダウンがあります。各アルゴリズムは、最適な処理 (ダウンサイジング、アップサイジング、整数比によるサイズ変更など) が異なり、速度も異なります。また、Paint.netには「最高品質」オプションがあり、使用することを決定したものを教えてくれます(ただし、スーパーサンプリングが何を指しているのかはわかりません...)、いくつかの画像とターゲットサイズで手動でそれを行いますそれが何を使用するかを確認すると、より高速なアルゴリズムを選択するのに役立つ場合があります。

@SamPlusPlus の回答は HighQualityBilinear を使用します。これは、IIRC がサイズ変更と少量のぼかしの追加に最適です (アルゴリズムによってシャープな線がアンチエイリアスされるため)。したがって、これら 2 つのうち、バイリニアは一般にアップサイジングに優れており、バイキュービックは一般にダウンサイジングに優れています。

私は、Lanczosアルゴリズムが最高のオールラウンド アルゴリズムの 1 つであると考えています (あらゆる量のアップサイジングまたはダウンサイジングに非常に適しています) が、遅いアルゴリズムの 1 つでもあります。画像をたとえば 7% 縮小する場合は、強くお勧めします (100:93 の比率を縮小するのは困難です)。

50%、25%、200% などを実行している場合、すべてのアルゴリズムは非常に似た結果になり、速度だけが異なります。

入力ファイルまたは出力ファイルのサイズが大きく変わる場合は、サイズ変更の種類に関係なく非常に優れており、速度について言及していないため、Lanczos のサイズ変更アルゴリズムを備えたライブラリを探すことをお勧めします。重要なのは、品質のみです。C# でそのようなライブラリを使用したことがないため、直接的な推奨事項はありません。

于 2012-12-05T22:35:04.400 に答える
-1

色の量子化を見る必要があります。このためのライブラリを実装しましたが、非常にうまく機能します。検索すると、かなりの数が見つかるはずです。今日中にコードを投稿できるかもしれません。

.NET でのカラー イメージの量子化

C# の単純なパレット量子化器

http://msdn.microsoft.com/en-us/library/aa479306.aspx

于 2012-12-05T21:04:18.203 に答える