【问题标题】:How to use CopyRect method in Delphi如何在 Delphi 中使用 CopyRect 方法
【发布时间】:2011-12-02 17:41:48
【问题描述】:

我正在从磁盘加载图像并希望将其复制(部分)到第二个 TImage:

Image1.Picture.LoadFromFile(S);
with Image1.Picture.Bitmap do
  Image2.Canvas.CopyRect(Image2.Canvas.ClipRect, Canvas, Canvas.ClipRect);

Image2 只显示一个白色矩形,而 Image1 不显示磁盘中的文件。如果我删除第二条语句 Image1 确实显示图像。 (最奇怪的是:如果我只注释掉 CopyRect 语句并留下“with”行(空语句)Image1 也不显示!)

如何使用 CopyRect 复制图像的一部分?

编辑
当我将这两个语句分成两个单独的操作(按钮)时,会发生以下情况:

  1. 图像加载并在 Image1 中显示
  2. Image1 消失(!),Image2 显示一个白色矩形。

顺便说一句,我使用的是 Delphi 2009。

【问题讨论】:

  • 我复制粘贴了你的代码,它对我来说很好用。尝试分离两个语句(在 2 个按钮中),看看会发生什么
  • 这并不奇怪:Image1.Picture.Bitmap 强制图形的类型包含“位图”。如果Image1.Picture 还不是位图(看起来是这样,尽管问题中没有),图形会释放它并创建位图。
  • @Magicmaster - 谢谢,但似乎不起作用。我添加了我的问题。
  • 这就是@Magic 的代码工作的原因,他正在加载一个“位图”。
  • @stevenvh:S 的文件名是什么?具体来说,文件扩展名是什么?是'bmp'、'png'、'jpg'、...?

标签: delphi


【解决方案1】:

TCanvas.CopyRect 使用StretchBlt 复制矩形。 StretchBlt 需要位图。如果您将任何其他图形类型加载到图像中,则其 Picture.Bitmap 为空。事实上,当您引用它时,就会创建位图:with Image1.Picture.Bitmap do

您可以使用临时位图来解决原因:

var
  Bmp: TBitmap;
begin
  Image1.Picture.LoadFromFile(S);

  Bmp := TBitmap.Create;
  try
    Bmp.Assign(Image1.Picture.Graphic);

    with Bmp do
      Image2.Canvas.CopyRect(Image2.Canvas.ClipRect, Canvas, Canvas.ClipRect);
  finally
    Bmp.Free;
  ..

【讨论】:

  • 谢谢,解决了。现在我只需要正确的颜色:-(
猜你喜欢
  • 2019-09-08
  • 1970-01-01
  • 2013-10-21
  • 2017-01-17
  • 1970-01-01
  • 1970-01-01
  • 2011-03-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多