はじめまして、皆様よろしくお願いいたします。
getpixelで得たRGB値をテキスト化したいのですが、textoutを使おうとすると、
'unsigned long' から 'char' に変換しました。データが失われているかもしれません。
と出ます。
これはCOLORREFで指定した関数に問題があるのでしょうか?
またはTextoutの方に問題があるのでしょうか?
初心者でよくわからないもので、よろしくお願いいたします。
> 'unsigned long' から 'char' に変換しました。データが失われているかもしれません。
これは、char型の引数にunsigned long型の値を渡したときなどに出る警告です。
関係部分のコードを掲げていただかない限り、これ以上のことは分かりません。
返答、ありがとうございます。
void CbitView::OnDraw(CDC* pDC)
{
CbitDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: この場所にネイティブ データ用の描画コードを追加します。
AfxGetApp()->m_pMainWnd->SetWindowText;
int x0=10,y0=10,x1=340,y1=260,xw=240,yh=320;
COLORREF color;
CDC myDC;
CBitmap newBitmap;
CBitmap *pOldBitmap;
newBitmap.LoadBitmap(IDB_GS);
myDC.CreateCompatibleDC(pDC);
pOldBitmap=myDC.SelectObject(&newBitmap);
myDC.SelectObject(pOldBitmap);
color=pDC->GetPixel(1,1);
pDC->TextOut(1,1,color);
いじったのはこんな感じです。よろしくお願いします。
> pDC->TextOut(1,1,color);
この場合のCDC::TextOut関数の第3引数はCString型の文字列です。
colorはCOLORREF型の数値ですから、これを表示させたい形式で文字列に変換してから、TextOut関数に渡す必要があります。
# このコードで本当にさっきの警告がでましたか?
ご回答ありがとうございます。
今試しました所、コンパイル出来ましたが(ごめんなさい)、
RGB値は表示されませんでした。
> colorはCOLORREF型の数値ですから、これを表示させたい形式で文字列に変換
要するにcolorを数値で具体的に表示できる形?に変換する、と言う事で合っていますでしょうか?非常に申し訳ないんですが、もし良かったら例を挙げていただけないでしょうか・・・?不躾なお願いですが、よろしくお願いします。
> pDC->TextOut(1,1,color);
>'unsigned long' から 'char' に変換しました。データが失われているかもしれません。
これだと TextOut(int,int,char) ってことになりますが・・・
VC6のMSDNにはそんなオーバーロード載ってません。
#.NETか過去バージョンにはこんなオーバーロードがあったのでしょうか・・・?
>要するにcolorを数値で具体的に表示できる形?に変換する、と言う事で合っていますでしょうか?非常に申し訳ないんですが、もし良かったら例を挙げていただけないでしょうか・・・?不躾なお願いですが、よろしくお願いします。
COLORREFは既に数値です。RGBが混ざっていて整形するのが少し面倒ですが。
テストはしてませんが一応整形するコード書きます。
>color=pDC->GetPixel(1,1);//この先に挿入してください
int r,g,b;
CString str;
r=color&0xff;//赤情報取り出し
g=(color>>8)&0xff;//緑情報取り出し
b=(color>>16)&0xff;//青情報取り出し
str.Format("R=%d G=%d B=%d",r,g,b);//CString文字列に変換
>pDC->TextOut(1,1,color);//この行を次に変更
pDC->TextOut(1,1,str);
本当にありがとうございます。
表示できました、が、どのピクセルからgetpixelしても
すべて255になってしまいます。
何でだろう・・・。
> 何でだろう・・・。
13:49:56掲載のコードでビットマップはちゃんと表示されていますか?
# エラーメッセージのときもそうでしたが、現象が再現するコードを示さず
# に質問されても答えようがありません。
monkeyさん、すみません。こちらがコードになります。
ビットマップを表示し(pDCに置いてなかっただけでした)、複数行に渡り
色情報を取っていった結果、普通に出来るようになりました。
void CbitView::OnDraw(CDC* pDC)
{
cCbitDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: この場所にネイティブ データ用の描画コードを追加します。
AfxGetApp()->m_pMainWnd->SetWindowText;
int x0=10,y0=10,x1=340,y1=260,xw=320,yh=240;
int r,g,b,i,j;
COLORREF color;
CDC myDC;
CBitmap newBitmap;
CBitmap *pOldBitmap;
newBitmap.LoadBitmap(IDB_GS);
myDC.CreateCompatibleDC(pDC);
pOldBitmap=myDC.SelectObject(&newBitmap);
pDC->BitBlt(x0,y0,xw,yh,&myDC,0,0,SRCCOPY);
myDC.SelectObject(pOldBitmap);
for(j=0;j<xw;j++)
for(i=0;i<yh;i++){
color=pDC->GetPixel(x0+i,y0+j);
CString str;
r=GetRValue(color);//赤情報取り出し
g=GetGValue(color);//緑情報取り出し
b=GetBValue(color);//青情報取り出し
str.Format("R=%d G=%d B=%d",r,g,b);//CString文字列に変換
pDC->TextOut(100,50+20*j,str);
}
}
これを後はテキストファイル化するだけです。がんばってみます。
ご教授ありがとうございました。勉強になりました。
# ちょっとだけフォロー
> r=color&0xff;//赤情報取り出し
> g=(color>>8)&0xff;//緑情報取り出し
> b=(color>>16)&0xff;//青情報取り出し
それぞれマクロが<wingdi.h>に定義されているので
それを使うとコメントもいらないかも。
r = GetRValue(color);
g = GetGValue(color);
b = GetBValue(color);
> # ちょっとだけフォロー
全然フォローになってなかった。
ようさんのコードでGet?Valueが使われてましたね。
寝ぼけてるみたい。ごめんなさい。
>RISKさん、
ご指摘ありがとうございます。
ツイート | ![]() |