RGBで色指定の方法とPlygonなどのAPI使用方法

解決


初心者M  2004-08-07 03:43:44  No: 10271

線を描いたりするコードのサンプルには色指定の方法はclAquaみたいな色しか方法が書いてありませんがRGBでの細かな、しかも簡単な指定方法はあるのでしょうか?  またFloodFillやPlygonなどのAPIの使用方法が具体的なサンプルコードがあったら教えてください。  宜しくお願いします。


sadoyama  URL  2004-08-07 10:14:36  No: 10272

私も、描画メソッド関係は、最初のうち不慣れでした。
デルフィのヘルプもコード例が少なく不親切に思います。
しかし、やはり画像ですので、ヘルプを見て、
1つのメソッドをいろいろな条件で試し、実際に描かれた図形を見ることが早道だと思います。

Delphi の 描画メソッドでの色指定は、おおむね TColor型です。
RGB値で指定したい場合は、次のように型変換をします。
合わせて Polygon のコード例とします。

procedure TForm1.Button1Click(Sender: TObject);
var
  Color: TColor;
begin
  Canvas.Brush.Color := TColor($FF0000);
  Canvas.Polygon([Point(10, 10), Point(30, 10),
                  Point(50, 30), Point(20, 50)]);
end;

しかし、場合によっては RGB値での指定が必要なときもあります。
その場合は、逆に TColor型 を RGB値に変換します。
下記例は、処理速度が非常に遅いので、通常は ScanLine を使用しますが、
TToolButton 用のBitmap作成ソフトなどでは、この方が簡便です。

procedure TForm1.Button3Click(Sender: TObject);
var
  Bmp: TBitmap;
  PixelRGB: LongInt;
  x: Integer;
begin
  Bmp := TBitmap.Create;
  Bmp.Width  := 20;
  Bmp.Height := 20;
  Bmp.PixelFormat := pf24bit;  // TBitmap作成
  try
    PixelRGB := ColorToRGB(clRed);
    for x := 6 to 15 do
      Bmp.Canvas.Pixels[x, 10] := PixelRGB;
    Image2.Picture.Bitmap := Bmp;
  finally
    Bmp.Free;
  end;
end;

FloodFill() のコード例もつけておきます。

procedure TForm1.Button2Click(Sender: TObject);
var
  Bmp: TBitmap;
  Color: TColor;
begin
  Bmp := TBitmap.Create;
  Bmp.Width  := 20;
  Bmp.Height := 20;
  Bmp.PixelFormat := pf24bit;  // TBitmap作成
  try
    Bmp.Canvas.Brush.Color := clBlue;
    Bmp.Canvas.FrameRect(Rect(4, 4, 16, 16));
    Image1.Picture.Bitmap := Bmp;
    Showmessage('白地に青で矩形を描いた');

    Color := Bmp.Canvas.Pixels[10, 10]; // [10, 10]座標の色を得る

    Bmp.Canvas.Brush.Color := clRed;
    // fsSurface を fsBorder に変えるとどうなるか
    // Brush.Color を clBlue, Color に変えるとどうなるか
    // 実際に試してみると更によく解ります。
    Bmp.Canvas.FloodFill(10, 10, Color, fsSurface);
    Image1.Picture.Bitmap := Bmp;
  finally
    Bmp.Free;
  end;
end;


初心者M  2004-08-10 02:28:52  No: 10273

sadoyama様ありがとうございました。  「打ちこんでみて覚える」で早速canvasにPolygonを描く例をマネしてやってみました。当方で実際に使うには「色、XYの位置を変数で指定」できないと使えませんので自分で工夫してやってみました。結果は下記のように書いて成功しました。ありがとうございました。ここでまた質問させていただきます

①第2、第3例のようにBMPをcreateしてimage1にコピーする目的、ご利益は何でしょうか?(まだ実験していませんが)
②「下記の例は非常に遅い」「通常はscanlineを使う」とのことでしたのでscanlineをキーワードにHELPを捜しましたがどうやってこの目的に使うのか分かりません。教えてください。

**********  大成功  ************
procedure TForm1.Button1Click(Sender: TObject);

var
  Color: TColor;
  x1,y1,x2,y2,x3,y3,x4,y4  : integer;
  c:longint;
  DC:string;
begin

  x1:=10;
  y1:=10;
  x2:=150;
  y2:=10;
  x3:=200;
  y3:=200;
  x4:=100;
  y4:=200;

  dc:='$02ff8844';
  c:=strtoint(dc);
  //c:=$02ff8844;
  Canvas.pen.Color := TColor(c);
  Canvas.Brush.Color := TColor(c);
  Canvas.Polygon([Point(x1, y1), Point(x2, y2),
                  Point(x3, y3), Point(x4, y4)]);

end;

end.


sadoyama  URL  2004-08-10 05:19:16  No: 10274

Mさん、今晩は。

>  BMPをcreateしてimage1にコピーする目的、ご利益は何でしょうか
  私の能力では、うまく説明する自信がありませんが。

  通常、画像の描画を行う場合、ファイルとして保存します。
  また、描画した画像の表示先は、可能性として複数あります。
  [例3]ではTBitmapを描画先にしましたが、同じ内容をMさんがやられたようにForm1.CanvasやImage1.Canvasなどに直接描画することも可能です。
  その他に重要な描画先としてはプリンタもあります。
  更に、既存の画像にいろいろ処理を施して(例えば輪郭を強調するなど)新しい画像を作ることもあります。

  いろいろな使い方があるわけですが、TBitmapを出発点にする事に慣れると、まずどこへでも自由に行きやすくて便利です。
  そいうわけで、私はTBitmapに描画してから各種表示先に表示するようにしています。が、結局「どういうわけなんだ」と言われそうですね。
  応援演説してくださる方があれば、よろしくお願いします。

> scanlineをキーワードにHELPを捜しましたがどうやってこの目的に使うのか分かりません。
  私もScanLineのHELPを初めて読んでときには、「だから、どうなんだ」といのが率直な思いでした。
  わかっている人が読めば更に良く解るが、わかっていない人が読んでもさっぱり解らない。
  この掲示板と密接な関係にあるようですが、次のサイトで公開されているコードを1つでよいからじっくりと時間をかけて解読すると解ります。
  それだけで、へたな本を1冊読むよりも大きく飛躍できるでしょう。
  http://madia.world.coocan.jp/
  ただし、Delphi3でのコードだったという記憶ですので、Delphi4以降しか使ったことが無い人には、難解かもしれません。
  Delphp3 では、SetLength で動的配列を作成できなかったという点です。  

  尚、ここで書かれているコードは、[例2]の方法でも書き直すことができますが、その場合、とんでもない時間を要します。


初心者M  2004-08-10 22:12:12  No: 10275

早速のレスをありがとうございました。  お勧めのサイトを見ましたが使えそうなTIPSが沢山ありましたのでお気に入りに追加しました。この情報は大変ありがたいものです。  scanlineについてはどれを指しているのか分かりませんでしたが、どうもファイル(画像)全体を加工する時に便利な手法のように見うけました。  描画段階ではどのように使うのかまだ私には理解できませんでしたので今後の課題として残しておきたいと思いました。

当初の質問は「RGB指定」でしたが、これに関しては前回で解決と思いますので解決欄にチェックを入れさせていただきました。

疑問は次々と浮かびます。  VBではstretchblt、BitBltなどで画像のスクロールなどをやってきましたが、例のお勧めサイトにもこれに関するTIPSは見られませんでした。  件名としては別件となろうかと思いますので別途新規質問をさせていただきますが宜しくお願いします。


jok  2004-08-10 22:50:45  No: 10276

>解決欄にチェックを入れさせていただきました。

まだ付いてませんけど。


SO  2004-08-10 23:13:38  No: 10277

http://www.asahi-net.or.jp/~HA3T-NKMR/index.htm


初心者M  2004-08-11 02:00:11  No: 10278

SO様    解決のチェックを入れるのを忘れていました。スミマセン。
ご紹介の書籍は在庫切れでした。  Delphiの本でお勧めいただいたものは(今までの経験では)皆在庫切れです。  やはり圧倒的に情報量がすくないですね?


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

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






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