ここから画像処理に関する記事を見つけました: http://www.switchonthecode.com/tutorials/csharp-tutorial-image-editing-saving-cropping-and-resizing
画像のリサイズ時に高画質を保ちたい。DPI値を上げることができれば、これを達成できると思います。これが可能かどうか誰にもわかりますか?もしそうなら、どうすればC#で実装できますか?
ここから画像処理に関する記事を見つけました: http://www.switchonthecode.com/tutorials/csharp-tutorial-image-editing-saving-cropping-and-resizing
画像のリサイズ時に高画質を保ちたい。DPI値を上げることができれば、これを達成できると思います。これが可能かどうか誰にもわかりますか?もしそうなら、どうすればC#で実装できますか?
まず、画像には 2 つの一般的なカテゴリがあることを指摘しておく価値があります。ベクター [例: SVG、WMF、Adobe Illustrator、Corel Draw Graphics] およびビットマップ (ラスターとも呼ばれる) 画像 [例: ビットマップ、JPEG、PNG 画像]。
ベクトル画像は、一連の数式および/または計算から形成されます。一方、ビットマップ画像は、画像が撮影されたオブジェクトの特定の特徴に対応する個々のドット (ピクセル) で構成されています。
画像のサイズを変更したい場合、最初に考慮すべきことは、それがビットマップ画像かベクター画像かです。ベクトル画像は計算によって得られるため、詳細を失うことなく完全にサイズ変更できます。ビットマップ イメージの場合は異なります。各ピクセルは互いに独立しているため、サイズを変更する場合は、ソース ピクセルとターゲット ピクセルの比率を増減するだけです。
したがって、ベクター画像のサイズを 2 倍にするには、ターゲットのサイズを 2 倍するだけで、すべてがうまくいきます。ビットマップに同じ効果を適用する必要がある場合は、実際には各ソース ピクセルを増やして 4 ピクセル (2 つの水平ピクセルの 2 行) をカバーすることになります。
もちろん、補間とフィルタリングを適用することにより、コンピューターはターゲット ピクセルのエッジを「滑らかにする」ことができるので、それらが互いに混ざり合い、適度にサイズ変更された画像のように見えますが、この出力はベクトルのサイズ変更と同じになることはありません。画像; ベクトル画像は完全にサイズ変更されます。
質問でDPIについても言及しました。DPI は基本的に、画像を画面に表示するときではなく、画像を印刷するときの 1 インチに対応するピクセル数です。したがって、画像の DPI を上げても、画面上の画像のサイズは大きくなりません。印刷の品質を上げるだけです [言うまでもなく、これはプリンターの最大解像度に依存します]。
画像のサイズを本当に変更したい場合、画像がビットマップの場合は、経験則として、元の画像のサイズの 200% を超えてサイズを大きくしないでください。そうしないと、品質が失われます。
ビットマップ画像のサイズを変更するコードについては、この回答を参照してください。
サンプルのベクター画像を表示するには、このリンクにアクセスしてください。
注:画像を拡大または縮小して、サイズがどのように変更されるかを確認してください。
典型的なビットマップはStackOverflow スプライトです。サイズ変更された品質を維持しません。
参考文献
これは、ベクター グラフィックの場合にのみ可能です。SVG を調べます。それ以外の場合は、その部分に Silverlight または Flex が必要になる可能性があると思います。
元の画像がサイズ変更された画像よりも小さい場合、できることはほとんどありません。休息は研究課題です。
GDI+ でメタデータを試してみましょう。あなたの要求に合うかもしれません
あなたが求めていることは実際には不可能です。同じ品質を維持しながら画像を拡大することはできません。
イメージをマップされたピクセルの配列 (文字通り「ビットマップ」) と考えると、これは理にかなっています。画像は一定量のデータで保存され、サイズを変更するときに操作する必要があるのはそれだけです。反対の例 (コメントの 1 つが示唆するテレビ番組など) は、純粋にフィクションです。
できる最善の方法は、サイズ変更に使用しているオブジェクトのInterpolationMode
プロパティをGraphics
「HighQualityBicubic」に設定することです。これは、GDI+ でサポートされている最高品質のスムージング アルゴリズムであり、実際には市場に出回っているすべての主要なグラフィック パッケージでサポートされています。Adobe Photoshop でさえ提供できる最高のものです。基本的に、補間とは、隣接するピクセルの相対値から、画像を大きくするために追加する新しいピクセルのおおよその値をコンピューターが計算することを意味します。これは「最善の推測」方法ですが、これまでに思いついた最善の妥協点です。
少なくとも、結果の画像には「ギザギザ」や粗いピクセル化された線はありません。
サンプルコード:
Graphics g;
g.InterpolationMode = Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
// ... insert the rest of your code here
さらに、GDI+ (.NET Framework がグラフィックス ルーチンのために内部で使用する) は、16 の倍数の画像サイズで最適に機能することに注意してください。 16 の倍数。これにより、元のイメージの品質が可能な限り維持されます。
理想的な解決策は、自由にサイズ変更できるベクター グラフィックスに切り替えることです。ピクセル情報の代わりに、画像の描画または「レンダリング」に使用される数学的情報が含まれています。詳しくはウィキペディアをご覧ください。