FMX Bicubic 画像拡縮

解決


かはい  2019-02-15 04:48:33  No: 49687

FMX Bicubicを使用しての画像拡縮は可能でしょうか?
resize(縮小)
DrawBitmap(拡大)
何がデフォルトの拡縮方法かわかりませんでしたが
画像が荒れるので
Bicubicを指定して(理想は3DBicubic)
拡縮したいと思います


ウォレス  2019-02-15 22:32:24  No: 49688

純粋な興味なんですが  3DBicubicってなんでしょう?ググってもいまいち出てきません。
BicubicならGDI+で実装されていますのでスクラッチで組む必要なく割と簡単にリサイズできるはずです。
FMXは詳しくないのでバーンとコードはれないですが。


かはい  2019-02-16 04:35:31  No: 49689

ウォレスさん、度々お世話になり、恐縮でございます。

3DバイキュービックはWindowsC#で利用できる拡縮方法です。
私が以前にC#で実際に作成しております。

工業用途ではなく、プロの写真関連の方を相手にすると、
体感的な印象で評価されるので、高精度・高精細な
3Dバイキュービックを使用すると、
経験上、プロの文句が出ない手法と勝手に解釈しています(笑)
(拡大する方向だと特に有効です  拡大はピクセル補完なので)

欲をかいて、3Dバイキュービック(そこまでは不要かもしれない)を
掲示板に投稿させていただきました。

C#での実際の表現

// 補間モードの設定
g.InterpolationMode = system.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;

プロクオリティはさておき、ただの「バイキュービック」を実現するために
できうることを、ご存じの範囲でご教授頂けますと幸いです。


通りすがり  2019-02-16 07:46:49  No: 49690

VCLでよければ中村さんの
SBクリエイティブ:Delphi Graphic Secrets
https://www.sbcr.jp/products/4797319224.html
に載ってた気がします。


かはい  2019-02-16 19:50:30  No: 49691

通りすがりさん情報をありがとうございます。
このような本もあるのですね、勉強になります。
今回はWin/Macでのクロス開発が目論見ですので
VCLそのものを使用することができません。
なんとか自身での追及も継続したいと思います。


Mr.XRAY  2019-02-18 05:47:53  No: 49692

>3DバイキュービックはWindowsC#で利用できる拡縮方法です。 
>私が以前にC#で実際に作成しております。

3DBicubic を昨日からずっ〜と探しているのですが見つかりません.
差支えなかったらどんな補間アルゴリズムなのか教えていたいただけますか ?
『(理想は3DBicubic) 』と書いていますので,できれば探してみたいと思います.

# プロ仕様の「秘密」のアルゴリズム ?  あるいは別の名称があるのか ?

[ InterpolationMode Enum ]
https://docs.microsoft.com/en-us/dotnet/api/system.drawing.drawing2d.interpolationmode?view=netframework-4.7.2


Nov  2019-02-18 08:06:26  No: 49693

ちなみに、.netのHighQualityBicubicは、Bicubicの前にぼかし処理を
実施しているだけだと思います。


Mr.XRAY  2019-02-18 09:11:43  No: 49694

>ちなみに、.netのHighQualityBicubicは、Bicubicの前にぼかし処理を 
>実施しているだけだと思います。 

なるほど.
Bicubic の高品質を連想しそうですね.

補間の効果は画像の種類によっても違ってきます.
そこに『プロクオリティ』の 3DBicubic というのがあると言うのですから.
私が無知だとは思いますが,プログラマーとしては見逃せません.
今回を機会に知りたいと思っています.


ウォレス  2019-02-18 19:17:55  No: 49695

Novさんのおっしゃる通り、HighQualityBicubic  は 縮小時のエイリアス(折り返し)を低減するために前段でLPFかけているだけです。
LPF+Bicubicを展開するとTAP数が増えますのでそういう意味では非常に大きなTAP数の補間処理を実装していることになります。
(一般に縮小の前にはLPF必要です。縮小にはQualityBicubicは適しません。)

ちなみにFMXでGDI+のサンプルってなかなか見つかりませんね。。。
VCLなら山ほど見つかるのですが。
そもそもFMXはプラットフォーム依存しないプログラムを書くためのものなのでwindows専用のGDI+を使う必要性がないのでしょうね。。。


Mr.XRAY  2019-02-18 20:02:14  No: 49696

>そもそもFMXはプラットフォーム依存しないプログラムを書くためのものなのでwindows専用のGDI+を使う必要性がないのでしょうね。。。 

だと思います.
FMX (FireMonkey) には Effect がありますから GDI+ を使用する必要があまりないのかも知れません.

ところで先程も『3Dバイキュービック』で検索してみましたが期待する情報はありませんでした.
C# に 3DBicubic がないのは明らかなので諦めることにします.
3DBicubic よ,お前さんは一体全体どこから来たんだい ?

後出しで 『今回はWin/Macでのクロス開発が目論見ですので 』とあります.
質問のタイトルである『FMX Bicubic  画像拡縮』の『FMX Bicubic』をキーワードでネット検索すると,
質問された方が希望していると思われるサンプルがヒットします (GitHub).
Google, Yahoo, Bing のいずれでも 10 件以内にヒットしました (昨日は)


かはい  2019-02-19 00:01:11  No: 49697

すいません  お騒がせしました
3DBicubicは数年前からの自身の思い込みの呼び方でした
皆様申し訳ございません

正確には、
HighQualityBicubic(高品質双三次補間)
事前フィルター処理が適用され、高品質の縮小処理が実行されます。
このモードを使用すると、変換後のイメージが高品質になります。
https://dobon.net/vb/dotnet/graphics/interpolationmode.html


ウォレス  2019-02-19 03:24:21  No: 49698

なんと14年も前になりますがBlogを書いておりました。
https://blog.goo.ne.jp/supurainhikaku/e/13d5f1f00f79ffa6ccca53df30aef731

この文言、大分盛ってあります。

HighQualityBicubic
事前フィルター処理が適用され、高品質の縮小処理が実行されます。 
このモードを使用すると、変換後のイメージが高品質になります。

×  変換後のイメージ  
〇  縮小後のイメージ  と表現すべき  

「高品質になります」も言い過ぎです。


かはい  2019-02-19 03:27:48  No: 49699

Mr.XRAY様、貴重な情報を有難うございます。
GitHubのサンプルが実際の(Bicubic)事例だと思われます。

FilterCatmullRom(=Bicubic?)
https://github.com/bLightZP/ImageInterpolation/blob/master/resizeimageunit.pas

しかしながら今の私には残念ながら
理解するところまで至りませんでした。(拙僧  Delphi歴2か月)
いつの日にか理解できる日を夢見て頑張りたいと思います。


ウォレス  2019-02-19 03:49:31  No: 49700

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;


かはい  2019-02-19 03:53:00  No: 49701

ウォレスさん
>「高品質になります」も言い過ぎです。 
言い過ぎではないですよ。
知覚的に(写真業界的には)
>前段でLPFかけているだけです。
そこは本掲示板でご指摘頂き、初めて分かった次第ですが
そうすることで
(場合によっては)
お客様が納得できる画像となることがある。(例外もあります)
バイリニアは画像の内容によって効果が適切/不適切が
(私だけの経験則かもしれませんが)
高品質双三次補間が全国のお客様の満足につながったことは
自信を持って述べることができます。(私だけの自己漫かもしれませんが)
でなければ高品質双三次補間の「存在理由」はなんなのか?
詳しくは前段処理の効果が
知覚的ユーザー判断に大きく影響します。
(ネットではこの件は詳細に延べません  誤解を生むと思うので)


かはい  2019-02-19 04:12:02  No: 49702

ウォレスさん、度々のヒント有難うございます。
頂いたコードを元に色々と試したいと思います。

お手数をお掛けして恐縮です。(拝)


Mr.XRAY  2019-02-19 04:32:20  No: 49703

>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] をクリックしても
ダウンロードのページ ( ファイル一覧のページ ) にジャンプします.


Mr.XRAY  2019-02-19 04:40:02  No: 49704

>コードを理解しなくても関数として提供されていますから,そのまま利用できます. 

resizeimageunit.pas をライブラリパスの通った場所 ( フォルダ内 ) に置きます.
uses に resizeimageunit を追加して resizeimageunit.pas 内の関数を使用します.


かはい  2019-02-19 04:59:44  No: 49705

情報有難うございます。Mr.XRAYさま。

delphi掲示板の皆さん「あったかいです」
うれしいです。

この業界で「おじさん」なのでご厚情頂いて「うれしいです」

頑張ってみます。

「ありがとう」


かはい  2019-02-19 05:32:43  No: 49706

他の言語との連携も「視野」に入れたいと思います。


かはい  2019-02-19 06:01:20  No: 49707

みなさまありがとうございます。


※返信する前に利用規約をご確認ください。








  このエントリーをはてなブックマークに追加