2011-12-10 32 views
4

イメージを透明な背景に設定したいが、特定の色のすべてのピクセルを透明に置き換えたくない。Bitmap.MakeTransparent()を使用せずに、C#で背景が透明になるように画像を設定するにはどうすればよいですか?

具体的には、画像は、IShellItemImageFactory.GetImageで取得したフォルダのサムネイル画像です。これは私にWindows Explorerのサムネイル表示で表示されるビットマップを表示しますが、背景は白です。

Bitmap.MakeTransparentを使用することができますが、ほとんどの場合、サムネイル画像に白が含まれている場合(白い色を含む画像などのフォルダが含まれている場合など)は問題ありません。

私の疑問を尋ねた後、私はどこからでも答えを見つけられず、実際に自分自身に尋ねなければならなかったことは、開発者として10年以上の間に初めてのことです。 (私はちょうどレベルアップしたことを意味すると思います!)

+0

これはあなたを助けることができるかもしれません:http://www.c-sharpcorner.com/UploadFile/mahesh/DrawTransparentImageUsingAB10102005010514AM/DrawTransparentImageUsingAB.aspx –

+0

どこに画像を表示したいですか(ツリービュー、ボタンなど...) )? *サムネイル画像に白が入っている場合* –

+0

私は画像ビューアアプリケーションを作成し、flowlayoutpanelの私のユーザコントロールにサムネイルを表示しました。マウスがサムネイルの上を移動すると、グラデーションで塗りつぶされた背景が描画されます(選択またはhottrackedによって色が異なります)。問題は、フォルダのサムネイル画像にその中の白い部分が含まれていると、その部分が透明になり、サムネイルペイントハンドラがグラデーションを使用して画像のその部分をペイントします(画像が "その部分は透明です)。これが今はっきりしているといいなあと思う? –

答えて

1

同じ色のピクセルを必要に応じて外に塗りつぶすためにflood-fillアルゴリズムを使用してください。それはPhotoshopの魔法杖に似たものです。私はどうなるのか

http://en.wikipedia.org/wiki/Flood_fill

いくつかのあいまいな色で塗りつぶしている(マゼンタはいつも私のためにそれをしない)、その後、透明ピクセルと洪水の充填が可能であるならば(私は知らない透明でその色を置き換えます)。

+0

イメージの境界線に白いピクセルがある場合、これは失敗します。たとえば、NBAのロゴを見てみましょう。http://upload.wikimedia.org/wikipedia/en/0/07/NBALogo.svg –

+0

これは良い解決策のようです。私はあなたの答えが正しい場合、それを試して更新します! (私が見た限りでは、境界線に白いピクセルはありません。まれにしかない場合は、Bitmap.MakeTransparentより悪いことはありません) –

+0

イメージがちょうど切り抜かれても失敗しません赤と青の領域のエッジが、OPはそのようなイメージをとにかく持っていません。 –

1

IShellItemImageFactory.GetImageから得られるものは、元の画像が白い背景に含まれている合成画像ですか?画像にサムネイルサイズと同じ縦横比がない場合は、白い背景があると思われます。たとえば、640x480イメージの96x96サムネイルを要求すると、上部と下部に空白があります。

この場合、問題があります。イメージに含まれる白いピクセルと、GetImageで追加された白いピクセルを区別することはできません。

できることがいくつかあります。画像をロードして自分でサイズを変更することができます。それはおそらく最も簡単です。自分のサムネイルキャッシュを維持したいと考えています。

GetImageによって返された画像を調べて、面の空白を探すことができます。基本的に、行(または列)のすべてのピクセルが白であれば、その行(または列)を透明にします。これより少し複雑です(例えば、the NBA logo)。しかし、それは本質的にあなたがやりたいことです。

+0

ええと...私は画像をロードして自分でそれを再スケーリングすることができたらいいと思う。それははるかに簡単だろう!しかしこれは*フォルダ*のサムネイルです。すなわちシェルによって生成される。また、私はシェルに256-256イメージを要求します。私が知っている限り、サムネイルのためにシェルによって維持されているサイズです。実際、GetImageに渡すフラグが正しいかどうかは疑問です。関連するコード行は次のとおりです。HResult hRes =((IShellItemImageFactory)ppsi).GetImage(新しいSIZE(256,256)、SIIGBF.SIIGBF_BIGGERSIZEOK | SIIGBF.SIIGBF_RESIZETOFIT、out hbitmap); –

+0

@Jerome:カラーパラメータをとる 'MakeTransparent'オーバーロードを呼び出すのに役立ちますか? 256x256画像の枠線を削除しようとしているのか、自分の背景の一部を削除(透明化)しようとしているのかはわかりません。独自の背景を取り除こうとしている場合は、透明部分を(Color.Limeのように)厄介なものにしてから、 'MakeTransparent(Color.Lime)'を呼び出します。 –

+0

ありがとうございますが、フラッド・フィルで解決しました。しかし、あなたの質問に答えるために...私は実際のシェルサムネイルビットマップイメージ(または、シェルイメージ抽出メソッドにフラグパラメータを手にした場合は黒い枠線)の周りの白い枠線を削除しようとしていました。だから、色を受け入れるMakeTransparentオーバーロードでさえも同じ問題があります。つまり、画像内のすべての白いピクセルを取り除き、画像の中に透明な「穴」を作ります。 –

関連する問題