喫茶XRAYトップページ


[9609] リージョンの代わり返信 削除
2016/2/20 (土) 22:27:31 Mr.XRAY
[Bitmapから円形に切り取り、別のBitmapに描画するには?]
http://hpcgi3.nifty.com/e-papy/DelphiBBS/wwwlng.cgi?print+201602/16020010.txt

にレスしたのですが,FireMonkey でした.ハハハッ.
環境はちゃんと書いて欲しいよな.
で,パスでできないか,簡単なテストをしてみました.
動作確認は Windows 7 U64(SP1) + Delphi XE5(UP2) pro FireMonkey HD

procedure TForm1.Button1Click(Sender: TObject);
var
  LCanvas   : TCanvas;
  LRect     : TRectF;
  LPathData : TPathData;
begin
  LCanvas := ImageControl1.Canvas;

  LCanvas.BeginScene;

  LRect := RectF(0, 0, ImageControl1.Width, ImageControl1.Height);
  OffsetRect(LRect, ImageControl1.Position.X, ImageControl1.Position.Y);
  LCanvas.Stroke.Color := TAlphaColorRec.Black;
  Fill.Color           := TAlphaColorRec.White;

  LPathData := TPathData.Create;
  try
//    LPathData.AddRectangle(LRect, 0, 0, []);
    LPathData.AddEllipse(RectF(LRect.Left + 50,
                               LRect.Top + 50,
                               LRect.Left + 150,
                               LRect.Top + 150));
    LPathData.ClosePath;
    LCanvas.FillPath(LPathData, 0.75);
  finally
    LPathData.Free;
  end;
  LCanvas.EndScene;
end;

2 番目の図は,LPathData.AddRectangle(LRect, 0, 0, []); を有効にした場合です.




[9610] Re:リージョンの代わり返信 削除
2016/2/20 (土) 22:31:19 Mr.XRAY
VCL だと,デバイスコンテキストが使えるので,
Halbow 資料館のコードを拝借して,こんな感じでできます.
動作確認環境は Windows 7 U64(SP1) + Delphi XE(UP1) Pro

procedure TForm1.Button1Click(Sender: TObject);
var
  LTop     : Integer;
  LLeft    : Integer;
  LWidth   : Integer;
  LHeight  : Integer;
  LRGN1    : HRGN;
  LCanvas  : TCanvas;
  LBitmap  : TBitmap;
  LSrcLeft : Integer;
  LSrcTop  : Integer;
  LSrcRect : TRect;
begin
  LCanvas := Image1.Picture.Bitmap.Canvas;

  //リージョン作成
  LTop    := 70;
  LLeft   := 30;
  LWidth  := 120;
  LHeight := 120;
  LRGN1 := CreateEllipticRgn(LLeft, LTop, LLeft + LWidth, LTop + LHeight);


  //リージョンでクリップする
  SelectClipRgn(LCanvas.Handle, LRGN1);
  //Image1.Picture.Bitmap.Canvasへの描画
  LBitmap := TBitmap.Create;
  try
    LBitmap.Width  := LWidth;
    LBitmap.Height := LHeight;
    LSrcLeft := 160;
    LSrcTop  := 0;
    LSrcRect := Rect(LSrcLeft, LSrcTop, LSrcLeft + LWidth, LSrcTop + LHeight);

    LBitmap.Canvas.CopyRect(LBitmap.Canvas.ClipRect,
                            Image2.Picture.Bitmap.Canvas,
                            LSrcRect);
    LCanvas.Draw(LLeft, LTop, LBitmap);
  finally
    FreeAndNil(LBitmap);
  end;


  //格好つけてフレームを描画してみる
  SelectClipRgn(LCanvas.Handle, 0);
  LCanvas.Brush.Color := clBlack;
  FrameRgn(LCanvas.Handle,
           LRGN1,
           LCanvas.Brush.Handle,
           2,
           2);

  DeleteObject(LRGN1);
end;

end.


[9613] Re:リージョンの代わり返信 削除
2016/2/22 (月) 08:20:36 Mr.XRAY
[FireMonkeyアプリケーションで、Bitmapから円形に切り取り、別のBitmapに描画するには]
http://www.gesource.jp/weblog/?p=7353

そうかぁ,マスクを使えばいいんだ.
VCL でも同じ手法でいけますね.

切り取る = リージョン

と考えてしまうんですよね (^^;


[9614] Re:リージョンの代わり返信 削除
2016/2/22 (月) 22:12:52 Mr.XRAY
> [Bitmapから円形に切り取り、別のBitmapに描画するには?]
> http://hpcgi3.nifty.com/e-papy/DelphiBBS/wwwlng.cgi?print+201602/16020010.txt


あら ?
山本さんとこに質問 ?
あっ,本当に質問している.でも... えっ !?
某掲示板の質問というか,期待する結果というか,動作仕様が違うような...

いや,その,それはそれとして,質問の文章というか,ねっ !?
もうちょっとね.何とかならない... ならないか...


[9615] 保存した状態では分からない返信 削除
2016/2/22 (月) 22:25:29 Mr.XRAY
>bitmapを画像に保存すると抜き出した領域以外が黒く表示されているので

ちなみにですね.
特に初心者の方に注意です.
「保存すると...」と書いてあります.
でもですね.保存した状態でですね.領域以外が黒いというのはですね.
実は分からないのですよ.
でしょう ?
表示してみないと分からないのです.ハイ.

だからですね,「保存したら」ではなく「何々という方法で何々で表示したら」
なんですね.これが.ホホホッ.

参考図です.
[05-01_アルファチャンネル付き画像を TImage に描画]
http://mrxray.on.coocan.jp/Delphi/plSamples/368_ScreenCaptureTest.htm#05-01


[9616] Re:保存した状態では分からない返信 削除
2016/2/22 (月) 22:34:55 Mr.XRAY
> >bitmapを画像に保存すると抜き出した領域以外が黒く表示されているので

こういう文章はたまに見かけますね.
以下とたいして違いはありません.と,私は思っていますです.

[質問の文章の例 - 実際に操作した手順を書く]
http://mrxray.on.coocan.jp/Delphi/Others/013.htm#01


INCM/CMT
Cyclamen v3.82