プロが教える店舗&オフィスのセキュリティ対策術

Visual Studio 2017 のMFCでアプリケーションを作成しています。

画像データを加工する処理があるんですが、
そこでCImageを使用しています。

CImageに自分で作成したRGBのバイナリデータをコピーする方法はありませんでしょうか。

CImage::SetPixelは一番理想的だったんですが、
かなり処理時間が掛り使えませんでした。
ネットにもCImage::SetPixel、GetPixelは処理時間が掛ると書かれていました。

BMPファイルなどであれば、CImage::Loadとか使えるんですが、
プログラム内部で作成したバイナリデータなので使えませんし、
せっかくバイナリデータであるのに
一度BMPファイル化するのも処理時間の無駄かと思いまして…。

データはunsigned char の配列で持っている状態です。

情報をお持ちのかたいらっしゃいましたら
よろしくお願い致します。

A 回答 (2件)

GDIやらビットマップやら…ここン年単位で触っていないですからねぇ……。



>attachのところで例外エラーになってしまいました。

img.Attach(hbitmap);
ですよね?
hbitmapは有効なハンドルになっていますかね?

>bitmap.CreateBitmap(HSize, YSize, 1, 8, buf); ※bufにはデータが格納されているとします。

パレットデータはどこで設定しているんでしょうか?
# って必要…ですよね???


あと…Bitmapで1行のバイト数は4で割り切れるサイズ…という制限があったかと思いましたが、その辺りは大丈夫ですか?
8Bitなら…Buff[((Width + 3) & 0xFFFFFFF8) * Height]なサイズが必要だった…かと。(後ろの余る部分は0x00埋めでしたかね)
    • good
    • 0
この回答へのお礼

Wr5さん

>hbitmapは有効なハンドルになっていますかね?
ウォッチで確認したところ「メモリを読み取れません」と出ました…。

>パレットデータはどこで設定しているんでしょうか?
パレットデータの設定を探したのですが、
どのようにすればよいのか分かりませんでした。
CBitmapのメソッドを見て見てもそれらしい設定がありませんでした。
パレットはどのように設定すればよいのでしょうか。

申し訳ありませんが
よろしくお願い致します。

お礼日時:2018/10/25 13:35

>データはunsigned char の配列で持っている状態です。



自体がどういうデータ構造なのか?
という問題はありますが……。

CBitmap::CreateBitmap()でCBitmapを作成、CImage::Attach()でアタッチすればよいのではないでしょうか?
https://dixq.net/forum/viewtopic.php?t=20192
    • good
    • 0
この回答へのお礼

Wr5さん
回答ありがとうございます。

RGBと書いていましたが
データは8bitの256色の画像データでした。
すみませんでした。

白黒のデータなので、
パレットは0~255のリニアなデータです。

なのでデータ部の部分をそのままR,G,Bデータとして
24bitフルカラーとして扱っていたりしていた(デバッグや実験として)ので
変な書き方をしてしまいました。

それで下記のように書いてみたんですが、
attachのところで例外エラーになってしまいました。

CImage img;
CBitmap bitmap;
unsigned char buf[HSize * YSize];

img.Create(HSize, YSize, 8);

bitmap.CreateBitmap(HSize, YSize, 1, 8, buf); ※bufにはデータが格納されているとします。

HBITMAP hbitmap = (HBITMAP)bitmap;

img.Attach(hbitmap);

img.Save(_T("test.bmp"));

ただ、
img.Create(HSize, YSize, 24);
bitmap.CreateBitmap(HSize, YSize, 3, 24, bufRGB);
と24bitとしてもエラーになってしまいました。

何処がまずいのでしょうか。

申し訳ありませんが
よろしくお願い致します。

お礼日時:2018/10/23 11:58

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A