bitmapの色をすべてある割合に落として表示したい

[戻る]
ガラ 2005/05/09(月) 14:13:54
OS XP VC++ 6.0
ビットマップを読み込んで、
読み込んだ1枚の画像の色を、すべてある一定の割り合い、減らして表示させたい。
一ピクセル、一ピクセル処理をするのは、簡単ですが、
それでは、遅くなるので、ないかよい関数は、ないでしょうか?
たとえば、すべて白のビットマップファイルを読み込んで、
灰色で表示するようなことをしたいのですが、どうでしょうか?

reshia 2005/05/09(月) 20:32:38
>遅くなるので
書き換えながら表示するわけではないと思いますし
たいして遅くないと思いますが・・

2005/05/10(火) 00:22:22
DDB ではなく DIB か DIBSection かを使えば、早いと感じられるかもしれません

ガラ 2005/05/10(火) 06:57:57
reshiaさん、 島さんレスありがとうございます。
フル画面計算しているので、かなり遅いですねぇ・・・
ロードしだしてから、5秒程度は、かかってます。
DIBしらべてみます。

PATIO 2005/05/11(水) 11:35:27
GetPixelとSetPixelを使っているなら多分遅いと思います。
GDIはオーバヘッドがでかいし。
ただ、処理するならメモリDC上でやらないとかなり足を引っ張りそう。

DIBSection等で画素子データの先頭ポインタを得てアドレス計算をして
取り出して演算するような事をすれば、多少は早くなるかもしれないですが、
フルカラーやトゥルーカラーの画像の処理はやっぱり重くなると思います。
256色なら割と早そうですけどね。
256色分のパレットを調整すれば、画素子側は弄らなくてよさそうだし。

kuma 2005/05/12(木) 00:39:31
この手のプログラムを組む経緯がありましたので
助言になれば。

# 以下は、関数に関する回答ではありません。
# 処理方法について言及したものです。

DIBSectionからピクセル値を取り出せるように
なりましたら、MMX命令を使用するとかなり高速に
処理ができるようになります。

とは言いましても、パレットの処理には到底
適いませんが。

実際の処理速度としましては

CPU : Celeron 700MHz
RAM : PC-133 CL2 192MB
O S : Windows Me

のPC上で 800x600 32bit(ARGB)の画像を2枚合成する
処理にかかる時間は

MMX使用時 :  80〜100ms(10〜12fps)
MMX非使用 : 200〜280ms( 4〜 5fps)

程でした。

今のCPUクロック、メモリ転送速度、バス転送速度なら
このスコアの2,3倍、それ以上でるかもしれません。

ガラ 2005/05/12(木) 08:12:13
PATIOさん、kumaさんありがとうございます。
あれこれ調べてみて、
もし、「CBitmap::LoadBitmap()で読み込んだ画像の
(他の画像に影響のないように)ローカルなパレット操作」
ができれば、有用なのですが、ご存知ないでしょうか。

kuma 2005/05/13(金) 00:26:57
MFCは疎いのでなんともいえませんが
CImageを使うのがベターかと。

PATIO 2005/05/16(月) 12:03:42
お解かりかもしれませんが、
24ビットカラーとかだと基本的にパレットを使わずに直接RGB値を画素子に入れると
思うので画素子レベルでやるしかないと思います。
私が書いているのはビットマップが中に抱えているパレットの話なので
他の画像には影響しません。

古いスレッドには追加発言できません。