getpixelで得たRGB値をテキスト化するには?

解決


よう  2004-07-04 21:50:40  No: 53891

はじめまして、皆様よろしくお願いいたします。

getpixelで得たRGB値をテキスト化したいのですが、textoutを使おうとすると、
'unsigned long' から 'char' に変換しました。データが失われているかもしれません。
と出ます。
これはCOLORREFで指定した関数に問題があるのでしょうか?
またはTextoutの方に問題があるのでしょうか?

初心者でよくわからないもので、よろしくお願いいたします。


monkey  2004-07-04 22:36:18  No: 53892

> 'unsigned long' から 'char' に変換しました。データが失われているかもしれません。

これは、char型の引数にunsigned long型の値を渡したときなどに出る警告です。
関係部分のコードを掲げていただかない限り、これ以上のことは分かりません。


よう  2004-07-04 22:49:56  No: 53893

返答、ありがとうございます。

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

いじったのはこんな感じです。よろしくお願いします。


monkey  2004-07-04 23:13:06  No: 53894

> pDC->TextOut(1,1,color);

この場合のCDC::TextOut関数の第3引数はCString型の文字列です。
colorはCOLORREF型の数値ですから、これを表示させたい形式で文字列に変換してから、TextOut関数に渡す必要があります。

# このコードで本当にさっきの警告がでましたか?


よう  2004-07-04 23:31:29  No: 53895

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

今試しました所、コンパイル出来ましたが(ごめんなさい)、
RGB値は表示されませんでした。

> colorはCOLORREF型の数値ですから、これを表示させたい形式で文字列に変換

要するにcolorを数値で具体的に表示できる形?に変換する、と言う事で合っていますでしょうか?非常に申し訳ないんですが、もし良かったら例を挙げていただけないでしょうか・・・?不躾なお願いですが、よろしくお願いします。


fuku  2004-07-05 00:37:16  No: 53896

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


よう  2004-07-05 00:49:40  No: 53897

本当にありがとうございます。

表示できました、が、どのピクセルからgetpixelしても
すべて255になってしまいます。

何でだろう・・・。


monkey  2004-07-05 01:22:53  No: 53898

> 何でだろう・・・。
13:49:56掲載のコードでビットマップはちゃんと表示されていますか?

# エラーメッセージのときもそうでしたが、現象が再現するコードを示さず
# に質問されても答えようがありません。


よう  2004-07-05 01:39:08  No: 53899

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);
}
}
これを後はテキストファイル化するだけです。がんばってみます。
ご教授ありがとうございました。勉強になりました。


RiSK  2004-07-05 07:24:54  No: 53900

# ちょっとだけフォロー

> r=color&0xff;//赤情報取り出し
> g=(color>>8)&0xff;//緑情報取り出し
> b=(color>>16)&0xff;//青情報取り出し

それぞれマクロが<wingdi.h>に定義されているので
それを使うとコメントもいらないかも。

r = GetRValue(color);
g = GetGValue(color);
b = GetBValue(color);


RiSK  2004-07-05 08:51:44  No: 53901

> # ちょっとだけフォロー

全然フォローになってなかった。
ようさんのコードでGet?Valueが使われてましたね。

寝ぼけてるみたい。ごめんなさい。


よう  2004-07-05 11:38:14  No: 53902

>RISKさん、
ご指摘ありがとうございます。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加