1bitの場合はこんな感じかな。
RGBQUAD rgb[2] = {{198,198,198,0},{255,255,255,0}};
image.SetColorTable(0, 2, rgb);
subaruさん
ご回答ありがとう
>RGBQUAD rgb[2] = {{198,198,198,0},{255,255,255,0}};
>image.SetColorTable(0, 2, rgb);
正常に表示できました。
ありがとう。
以下の質問があります。
1.
RGBQUAD rgb[2] = {{198,198,198,0},{255,255,255,0}};
pDoc->imgOriginal1.SetColorTable(0, 2, rgb);
全領域(Image)に変換された、
部分的に変換したい場合可能なのでしょうか。
例
for (int j=0; j<250; j++){
for (int i=0; i<250; i++){
・・・
}
}
つづき
2、
pDoc->imgOriginal1.SetPixel(j, i, color);
あるいは、
pDoc->imgOriginal1.SetColorTable(0, 2, rgb);
はOnDraw()内ありますが、
表示スピードが遅くなっています。
やりたいことは、
Imageファイルを読み込み時に一回変換して、
システムを終了するまで使えます、
(必要の場合はもう一回変換して、)
そうならば、表示のスピードが早くなりますね。
問題というのは、一回変換したファイルがどう保存する問題が出ってきます、
どう解決すれば良いでしょうか。
よろしくお願いします。
>全領域(Image)に変換された、
>部分的に変換したい場合可能なのでしょうか。
SetPixelを使うかGetBitsで直接アクセスして
任意の範囲を任意の色に変更します。
(モノクロのままだと当然2色しか使えません)
>はOnDraw()内ありますが、
>表示スピードが遅くなっています。
CImageをローカル変数で使ってるんでしょうか?
クラスメンバに保持しておけば毎回変換せずに済みます。
subaruさん
返事が遅くなりました。すみませんでした。
できたこと
>CImageをローカル変数で使ってるんでしょうか?
>クラスメンバに保持しておけば毎回変換せずに済みます。
うまくできました。
できていない。
8bitの場合はどうやれば良いでしょうか。
質問1
フルカラーの場合は
for (int j=0; j<ScrWH->x; j++){
for (int i=0; i<ScrWH->y; i++){
imgOriginal1.SetPixel(j, i, color);
}
}
変換処理の時間がかかります。もっと早く処理の方法があるのでしょうか。
質問2
変換処理後のファイルを保存したい場合は、どう保存すればいいでしょうか。
(特にフルカラーファイルの保存)
よろしくお願いします。
>質問1
>フルカラーの場合は
>for (int j=0; j<ScrWH->x; j++){
> for (int i=0; i<ScrWH->y; i++){
> imgOriginal1.SetPixel(j, i, color);
> }
>}
>変換処理の時間がかかります。もっと早く処理の方法があるのでしょうか。
GetBits+GetPitchかGetPixelAddressを使う方がはるかに高速です。
例えばCImageが32bitの場合に(10, 10)-(20, 20)の範囲のみを
RGB(198,198,198)にするなら次のように書くことができます。
for(int y = 10; y < 20; y++) {
DWORD* ppixels = static_cast<DWORD*>(image.GetPixelAddress(0, y));
for(int x = 10; x < 20; x++) {
ppixels[x] = 0xffc6c6c6;
}
}
この場合各ピクセルは4バイトでARGBを表しています。
8bitで行う場合には各ピクセルは1バイトになりますが、
パレットへのインデックスを入れてやらないといけないので、直接色を指定したい場合は
CPalette::GetNearestPaletteIndexも使うとよいかもしれません。
>質問2
>変換処理後のファイルを保存したい場合は、どう保存すればいいでしょうか。
>(特にフルカラーファイルの保存)
具体的にどの部分がわかりませんか?
まずはCImage::Saveメソッドの仕様をご確認ください。
subaruさん
返事が遅くなりました。すみませんでした。
(最近、別の仕事をしています)
>for(int y = 10; y < 20; y++) {
> DWORD* ppixels = static_cast<DWORD*>(image.GetPixelAddress(0, y));
> for(int x = 10; x < 20; x++) {
> ppixels[x] = 0xffc6c6c6;
> }
>}
以上のようにやってみたら、うまくできませんでした。
色が変えたのですが、直線のグレ、緑、ピンクなどが並んでいます。元の図画が変えました。
どうすれば良いでしょうか。
>まずはCImage::Saveメソッドの仕様をご確認ください。
できました。ありがとうございました。
よろしくお願いします。
>>for(int y = 10; y < 20; y++) {
>> DWORD* ppixels = static_cast<DWORD*>(image.GetPixelAddress(0, y));
>> for(int x = 10; x < 20; x++) {
>> ppixels[x] = 0xffc6c6c6;
>> }
>>}
>以上のようにやってみたら、うまくできませんでした。
>色が変えたのですが、直線のグレ、緑、ピンクなどが並んでいます。元の図画が変えま
した。
>どうすれば良いでしょうか。
このコードは32ビットを前提にしてますけど
画像を読み込んだ後に32ビットに変換してますかね?
SetPixelのようにフォーマットを意識しないで使えるものではありません。
しばらく静観していましたが、
イメージ用のAPIとかクラスの関数等を使用せずに
画素情報を自分でハンドリングするのでしたら
画像情報がメモリ上でどのように格納されているのか
という部分の知識が必須になりますよ。
その部分の知識が足りないのであれば、
その部分に関してはWeb上で情報を検索するなり、
書籍で勉強するなりしてそれなりの知識を収集しないと
掲示板上の質問だけで何とかするのはちょっと無理だと思います。
ただうまく行きませんでは知識が身に付きませんから
その辺はある程度自力で調べて勉強した方が良いと思いますよ。
PATIOさんに同感です
メモリー上での格納方法(DIB形式での)を理解することが先決だと思います
subaruさん、PATIO さん、szgy_physさん
ご返事ありがとう。
>このコードは32ビットを前提にしてますけど
>画像を読み込んだ後に32ビットに変換してますかね?
すみませんが、24ビットです。(フルカラー)
>SetPixelのようにフォーマットを意識しないで使えるものではありません。
>その辺はある程度自力で調べて勉強した方が良いと思いますよ。
そうですね、その辺が確かに知識が不足ですが、
時間があれば勉強します。
いろいろ教えていただき、ありがとうございました。
24ビットで処理する場合は各ピクセルは3バイトになります。
for(int y = 10; y < 20; y++) {
RGBTRIPLE* ppixels = static_cast<RGBTRIPLE*>(image.GetPixelAddress(0, y));
for(int x = 10; x < 20; x++) {
RGBTRIPLE& rgb = ppixels[x];
rgb.rgbtBlue = rgb.rgbtGreen = rgb.rgbtRed = 0xc6;
}
}