FMX Bicubicを使用しての画像拡縮は可能でしょうか?
resize(縮小)
DrawBitmap(拡大)
何がデフォルトの拡縮方法かわかりませんでしたが
画像が荒れるので
Bicubicを指定して(理想は3DBicubic)
拡縮したいと思います
純粋な興味なんですが 3DBicubicってなんでしょう?ググってもいまいち出てきません。
BicubicならGDI+で実装されていますのでスクラッチで組む必要なく割と簡単にリサイズできるはずです。
FMXは詳しくないのでバーンとコードはれないですが。
ウォレスさん、度々お世話になり、恐縮でございます。
3DバイキュービックはWindowsC#で利用できる拡縮方法です。
私が以前にC#で実際に作成しております。
工業用途ではなく、プロの写真関連の方を相手にすると、
体感的な印象で評価されるので、高精度・高精細な
3Dバイキュービックを使用すると、
経験上、プロの文句が出ない手法と勝手に解釈しています(笑)
(拡大する方向だと特に有効です 拡大はピクセル補完なので)
欲をかいて、3Dバイキュービック(そこまでは不要かもしれない)を
掲示板に投稿させていただきました。
C#での実際の表現
// 補間モードの設定
g.InterpolationMode = system.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
プロクオリティはさておき、ただの「バイキュービック」を実現するために
できうることを、ご存じの範囲でご教授頂けますと幸いです。
VCLでよければ中村さんの
SBクリエイティブ:Delphi Graphic Secrets
https://www.sbcr.jp/products/4797319224.html
に載ってた気がします。
通りすがりさん情報をありがとうございます。
このような本もあるのですね、勉強になります。
今回はWin/Macでのクロス開発が目論見ですので
VCLそのものを使用することができません。
なんとか自身での追及も継続したいと思います。
>3DバイキュービックはWindowsC#で利用できる拡縮方法です。
>私が以前にC#で実際に作成しております。
3DBicubic を昨日からずっ〜と探しているのですが見つかりません.
差支えなかったらどんな補間アルゴリズムなのか教えていたいただけますか ?
『(理想は3DBicubic) 』と書いていますので,できれば探してみたいと思います.
# プロ仕様の「秘密」のアルゴリズム ? あるいは別の名称があるのか ?
[ InterpolationMode Enum ]
https://docs.microsoft.com/en-us/dotnet/api/system.drawing.drawing2d.interpolationmode?view=netframework-4.7.2
ちなみに、.netのHighQualityBicubicは、Bicubicの前にぼかし処理を
実施しているだけだと思います。
>ちなみに、.netのHighQualityBicubicは、Bicubicの前にぼかし処理を
>実施しているだけだと思います。
なるほど.
Bicubic の高品質を連想しそうですね.
補間の効果は画像の種類によっても違ってきます.
そこに『プロクオリティ』の 3DBicubic というのがあると言うのですから.
私が無知だとは思いますが,プログラマーとしては見逃せません.
今回を機会に知りたいと思っています.
Novさんのおっしゃる通り、HighQualityBicubic は 縮小時のエイリアス(折り返し)を低減するために前段でLPFかけているだけです。
LPF+Bicubicを展開するとTAP数が増えますのでそういう意味では非常に大きなTAP数の補間処理を実装していることになります。
(一般に縮小の前にはLPF必要です。縮小にはQualityBicubicは適しません。)
ちなみにFMXでGDI+のサンプルってなかなか見つかりませんね。。。
VCLなら山ほど見つかるのですが。
そもそもFMXはプラットフォーム依存しないプログラムを書くためのものなのでwindows専用のGDI+を使う必要性がないのでしょうね。。。
>そもそもFMXはプラットフォーム依存しないプログラムを書くためのものなのでwindows専用のGDI+を使う必要性がないのでしょうね。。。
だと思います.
FMX (FireMonkey) には Effect がありますから GDI+ を使用する必要があまりないのかも知れません.
ところで先程も『3Dバイキュービック』で検索してみましたが期待する情報はありませんでした.
C# に 3DBicubic がないのは明らかなので諦めることにします.
3DBicubic よ,お前さんは一体全体どこから来たんだい ?
後出しで 『今回はWin/Macでのクロス開発が目論見ですので 』とあります.
質問のタイトルである『FMX Bicubic 画像拡縮』の『FMX Bicubic』をキーワードでネット検索すると,
質問された方が希望していると思われるサンプルがヒットします (GitHub).
Google, Yahoo, Bing のいずれでも 10 件以内にヒットしました (昨日は)
すいません お騒がせしました
3DBicubicは数年前からの自身の思い込みの呼び方でした
皆様申し訳ございません
正確には、
HighQualityBicubic(高品質双三次補間)
事前フィルター処理が適用され、高品質の縮小処理が実行されます。
このモードを使用すると、変換後のイメージが高品質になります。
https://dobon.net/vb/dotnet/graphics/interpolationmode.html
なんと14年も前になりますがBlogを書いておりました。
https://blog.goo.ne.jp/supurainhikaku/e/13d5f1f00f79ffa6ccca53df30aef731
この文言、大分盛ってあります。
HighQualityBicubic
事前フィルター処理が適用され、高品質の縮小処理が実行されます。
このモードを使用すると、変換後のイメージが高品質になります。
× 変換後のイメージ
〇 縮小後のイメージ と表現すべき
「高品質になります」も言い過ぎです。
Mr.XRAY様、貴重な情報を有難うございます。
GitHubのサンプルが実際の(Bicubic)事例だと思われます。
FilterCatmullRom(=Bicubic?)
https://github.com/bLightZP/ImageInterpolation/blob/master/resizeimageunit.pas
しかしながら今の私には残念ながら
理解するところまで至りませんでした。(拙僧 Delphi歴2か月)
いつの日にか理解できる日を夢見て頑張りたいと思います。
https://github.com/bLightZP/ImageInterpolation/blob/master/resizeimageunit.pas
にはBicubicはないような。
記述するなら下記かな。
function FilterBicubic(Value: Single): Single;
begin
{
|x|<1 :1-2|x|^2+|x|^3
1<=|x|<2 :4-8|x|+5|x|^2-|x|^3
}
if Value < 0.0 then
Value := -Value;
if Value < 1.0 then
Result := 1.0 - 2.0 * Value * Value + Value * Value * Value
else if Value < 2.0 then
Result := 4.0 - 8.0 * Value + 5.0 * Value * Value - Value * Value * Value
else
Result := 0.0;
end;
ウォレスさん
>「高品質になります」も言い過ぎです。
言い過ぎではないですよ。
知覚的に(写真業界的には)
>前段でLPFかけているだけです。
そこは本掲示板でご指摘頂き、初めて分かった次第ですが
そうすることで
(場合によっては)
お客様が納得できる画像となることがある。(例外もあります)
バイリニアは画像の内容によって効果が適切/不適切が
(私だけの経験則かもしれませんが)
高品質双三次補間が全国のお客様の満足につながったことは
自信を持って述べることができます。(私だけの自己漫かもしれませんが)
でなければ高品質双三次補間の「存在理由」はなんなのか?
詳しくは前段処理の効果が
知覚的ユーザー判断に大きく影響します。
(ネットではこの件は詳細に延べません 誤解を生むと思うので)
ウォレスさん、度々のヒント有難うございます。
頂いたコードを元に色々と試したいと思います。
お手数をお掛けして恐縮です。(拝)
>FilterCatmullRom(=Bicubic?)
>https://github.com/bLightZP/ImageInterpolation/blob/master/resizeimageunit.pas
FMX Bicubic』をキーワードでネット検索すると,
[High quality, pure pascal image interpolation (resizing/scaling) using TBitmap (VCL/FMX)]
https://github.com/bLightZP/ImageInterpolation
といのがヒットします.
このページの右側の緑色のボタンをクリックします.
表示される [Download zip] をクリックするとコードがダウンロードできます.
コードを理解しなくても関数として提供されていますから,そのまま利用できます.
>https://github.com/bLightZP/ImageInterpolation/blob/master/resizeimageunit.pas
のページの一番上の bLightZP/ImageInterpolation の [ImageInterpolation] をクリックしても
ダウンロードのページ ( ファイル一覧のページ ) にジャンプします.
>コードを理解しなくても関数として提供されていますから,そのまま利用できます.
resizeimageunit.pas をライブラリパスの通った場所 ( フォルダ内 ) に置きます.
uses に resizeimageunit を追加して resizeimageunit.pas 内の関数を使用します.
情報有難うございます。Mr.XRAYさま。
delphi掲示板の皆さん「あったかいです」
うれしいです。
この業界で「おじさん」なのでご厚情頂いて「うれしいです」
頑張ってみます。
「ありがとう」
他の言語との連携も「視野」に入れたいと思います。
みなさまありがとうございます。
ツイート | ![]() |