【问题标题】:Copy displayed picture on a TPanel into a TImage将 TPanel 上显示的图片复制到 TImage 中
【发布时间】:2025-12-20 06:15:10
【问题描述】:

我已成功将 MPlayer 视频结果嵌入到TPanel,但无法将TPanel 结果复制到TImage

只有TPanel的正常图片被复制到TImage中:

使用管道和 MPlayer wid 命令行参数执行嵌入。 MPlayer 使用TPanel 句柄来显示结果。

以下sn-ps测试过,只是正常的TPanel图片复制到TImage

  Image1.Picture.Bitmap.Canvas.CopyRect(
    Rect(0, 0, Image1.Width-1, Image1.Height-1),
    TMyPanel(Panel1).Canvas,     //TMyPanel is an empty class to access canvas property 
    Rect(0, 0, Panel1.Width-1, Panel1.Height-1)
  );

还有这个:

Function PanelToBmp ( Panel:TPanel):TBitmap;
VAR
  bmp : tBitmap;
  DC  : HDC;
Begin
  bmp := tBitmap.Create;
  bmp.width := Panel.Width;
  bmp.Height := Panel.Height;
  DC := GetDc ( Panel.Handle );
  Bitblt(bmp.canvas.handle, 0, 0, Panel.Width, Panel.Height, Dc, 0, 0, NOTSRCCOPY);
  Releasedc (Panel.handle,dc);
  result := bmp;
End;

【问题讨论】:

  • 我并不特别了解 MPlayer,但通常视频的渲染方式略有不同,您无法对其进行“正常”截图。我确实找到了一些关于 MPlayer 的信息,这表明您需要使用特定参数启动它,之后您可以让 MPlayer 自己制作屏幕截图。也许有办法将这些命令发送到您的嵌入式 MPlayer?见thisthis

标签: delphi delphi-xe6 mplayer


【解决方案1】:

你也可以通过剪贴板复制,试试这个:

uses ClipBrd;

procedure TForm1.Button1Click(Sender: TObject);
var
  lBmp: TBitmap;
begin
  lBmp := TBitmap.Create;
  try
    lBmp.SetSize(Panel1.ClientWidth, Panel1.ClientHeight);
    BitBlt(lBmp.Canvas.Handle, 0, 0, Panel1.ClientWidth, Panel1.ClientHeight, TMyPanel(Panel1).Canvas.Handle, 0, 0, SRCCOPY);
    Clipboard.Assign(lBmp);

   Image1.Picture.Bitmap.Assign( lBmp );
  finally
    lBmp.Free;
  end;
end;

希望对你有所帮助。

【讨论】:

  • 感谢脚本,但不起作用。像其他脚本一样只显示普通面板的图片。