- - PR -
C# アルファ透過が指定されている画像をビットマップに書くと汚くなる。
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2007-02-02 00:13
UxTheme APIを使用して描画を行っています。フォームに書くと綺麗にアルファが処理されるんですがビットマップに書くとアルファが処理されずところどころ黒く残ってしまいます。
DrawIconでも同じようなことが起こったような気がしますが、アルファを綺麗に処理してビットマップに書き込むことはGDI+では可能でしょうか?または受け側がビットマップだと処理できないのでしょうか?orz ご教授おねがいいたします。 _________________ 有末 清華 crazy(){for;;{you();}} - プログラマの覚書 | ||||||||
|
投稿日時: 2007-02-02 04:48
書き込み先の Bitmap はアルファ値をサポートしていますか? | ||||||||
|
投稿日時: 2007-02-02 17:04
書き込みBitmapはいろいろなPixcelFormat形式を試してみましたがだめでした。もちろん中にはアルファサポートの PixelFormat.Format32bppArgb などもあります。
こんな感じです
# http://www.tech-archive.net/Archive/DotNet/microsoft.public.dotnet.framework.windowsforms/2006-01/msg00237.html と同じ質問ですね。 _________________ 9uiet design( http://quietdesign.rental.allinoneserver.net/ ) - タブ型デスクトップガジェット開発中。Pluginの開発してくれると嬉しいかも。 [ メッセージ編集済み 編集者: 有末 清華 編集日時 2007-02-02 17:23 ] | ||||||||
|
投稿日時: 2007-02-02 22:25
BufferedGraphics を使うことによって解決しました…がパフォーマンスが非常に悪いです。
フォームのリージョンを画像データから作成してます、透過色に指定されているいろをピクセルごとに見てリージョンに追加していく方法です。 よってBufferedGraphicsを使った際は一度ビットマップに変換してやってから書くのですがそこが遅い。 仕方がないので#ifをつかってBufferedGraphicsを使うバージョンとBitmapを使うバージョンの二つを用意することにしました。 お騒がせしました m(_ _)m _________________ 有末 清華 crazy(){for;;{you();}} - プログラマの覚書 | ||||||||
|
投稿日時: 2007-02-03 00:16
まさか GetPixel() とか使ってますか? 特に小さな画像を扱う場合を除いて、Bitmap.LockBits() してビットマップデータを直接参照する方が高速です。 | ||||||||
|
投稿日時: 2007-02-03 01:07
まさかw
unsafeでまわしてます。 画像からリージョンを作るところよりもバッファからビットマップに変換するところが遅いんですよorz backSurface.Render(); これ、かなり遅い。リージョンを作成する用の画像に一回とフォームに一回なんてやってられませんorz Bitmapをバッファに使えばそのバッファからリージョン作成できるんで作業が一回で済みます。 っていみの遅いです。 _________________ 有末 清華 crazy(){for;;{you();}} - プログラマの覚書 | ||||||||
|
投稿日時: 2007-02-03 06:07
実用上問題があるほど実時間がかかってるんですか?
は、ほとんど cpu なんか使ってないような気がするんですが。 | ||||||||
|
投稿日時: 2007-02-03 11:13
僕もそう思ったんですが実際に遅いんですよね(汗。
いま作ってるのがリスト形式にアイテムを表示するフォームでマウスのホバーでアイテムを選択します。よってMouseMoveが起こったときにマウスの位置から選択されているアイテムの位置を取得して、選択されているアイテムが変わっていた場合(状態が変わっていた場合含む)描画します。 描画ではまずはバッファに書き込みます、そしてバッファからリージョンを作成して最後にプライマリに書き込みます。 アイテム数が少ない場合は問題ないのですが、10個20個になると処理が遅くマウスの動きにセレクターがついていってくれません。 コードは下記です。
こういうのパフォーマンスが悪いと使っててイライラしますからねぇorz _________________ 有末 清華 crazy(){for;;{you();}} - プログラマの覚書 |