画像の処理 – 固定ページ 2 – プログラミング – Home

通知
すべてクリア

画像の処理

固定ページ 2 / 2

subaru
 subaru
(@subaru)
ゲスト
結合: 19年前
投稿: 381
 

1bitの場合はこんな感じかな。

RGBQUAD rgb[2] = {{198,198,198,0},{255,255,255,0}};
image.SetColorTable(0, 2, rgb);


返信引用
cc
 cc
(@cc)
ゲスト
結合: 23年前
投稿: 80
Topic starter  

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++){
      ・・・
    }


返信引用
cc
 cc
(@cc)
ゲスト
結合: 23年前
投稿: 80
Topic starter  

つづき
2、
pDoc->imgOriginal1.SetPixel(j, i, color);
あるいは、
pDoc->imgOriginal1.SetColorTable(0, 2, rgb);
はOnDraw()内ありますが、
表示スピードが遅くなっています。

やりたいことは、
Imageファイルを読み込み時に一回変換して、
システムを終了するまで使えます、
(必要の場合はもう一回変換して、)
そうならば、表示のスピードが早くなりますね。
問題というのは、一回変換したファイルがどう保存する問題が出ってきます、
どう解決すれば良いでしょうか。

よろしくお願いします。


返信引用
subaru
 subaru
(@subaru)
ゲスト
結合: 19年前
投稿: 381
 

>全領域(Image)に変換された、
>部分的に変換したい場合可能なのでしょうか。
SetPixelを使うかGetBitsで直接アクセスして
任意の範囲を任意の色に変更します。
(モノクロのままだと当然2色しか使えません)

>はOnDraw()内ありますが、
>表示スピードが遅くなっています。
CImageをローカル変数で使ってるんでしょうか?
クラスメンバに保持しておけば毎回変換せずに済みます。


返信引用
cc
 cc
(@cc)
ゲスト
結合: 23年前
投稿: 80
Topic starter  

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
変換処理後のファイルを保存したい場合は、どう保存すればいいでしょうか。
(特にフルカラーファイルの保存)

よろしくお願いします。


返信引用
subaru
 subaru
(@subaru)
ゲスト
結合: 19年前
投稿: 381
 

>質問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メソッドの仕様をご確認ください。


返信引用
cc
 cc
(@cc)
ゲスト
結合: 23年前
投稿: 80
Topic starter  

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メソッドの仕様をご確認ください。
できました。ありがとうございました。

よろしくお願いします。


返信引用
subaru
 subaru
(@subaru)
ゲスト
結合: 19年前
投稿: 381
 

>>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のようにフォーマットを意識しないで使えるものではありません。


返信引用
PATIO
(@patio)
Famed Member
結合: 3年前
投稿: 2660
 

しばらく静観していましたが、
イメージ用のAPIとかクラスの関数等を使用せずに
画素情報を自分でハンドリングするのでしたら
画像情報がメモリ上でどのように格納されているのか
という部分の知識が必須になりますよ。

その部分の知識が足りないのであれば、
その部分に関してはWeb上で情報を検索するなり、
書籍で勉強するなりしてそれなりの知識を収集しないと
掲示板上の質問だけで何とかするのはちょっと無理だと思います。
ただうまく行きませんでは知識が身に付きませんから
その辺はある程度自力で調べて勉強した方が良いと思いますよ。


返信引用
szgy_phys
 szgy_phys
(@szgy_phys)
ゲスト
結合: 17年前
投稿: 3
 

PATIOさんに同感です
メモリー上での格納方法(DIB形式での)を理解することが先決だと思います


返信引用
cc
 cc
(@cc)
ゲスト
結合: 23年前
投稿: 80
Topic starter  

subaruさん、PATIO さん、szgy_physさん
ご返事ありがとう。

>このコードは32ビットを前提にしてますけど
>画像を読み込んだ後に32ビットに変換してますかね?

すみませんが、24ビットです。(フルカラー)

>SetPixelのようにフォーマットを意識しないで使えるものではありません。

>その辺はある程度自力で調べて勉強した方が良いと思いますよ。

そうですね、その辺が確かに知識が不足ですが、
時間があれば勉強します。

いろいろ教えていただき、ありがとうございました。


返信引用
subaru
 subaru
(@subaru)
ゲスト
結合: 19年前
投稿: 381
 

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;
}
}


返信引用
固定ページ 2 / 2

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました