粘贴 PNG/JPG 个文件时不支持剪贴板格式

Unsupported clipboard format when pasting PNG/JPG files

我正在编写一个单元,我可以在其中粘贴剪贴板中的图像并将其保存在数据库中。如果我从 WhatsApp/Telegram Web.

截取屏幕截图或复制图像,代码实际上可以工作

但是当我尝试从剪贴板粘贴 PNG 或 JPG 文件 时出现问题 - 错误消息是:

Unsupported clipboard format

为什么此代码适用于屏幕截图而不适用于 PNG 或 JPG 文件?我该如何解决?

BMP := TBitmap.Create;
BMP.Assign(Clipboard);      //Here is where I got the exception
BMP.PixelFormat := pf32bit;
JPG := TJPEGImage.Create;
JPG.Assign(BMP);
JPG.CompressionQuality := 75;
AdvOfficeImage1.Picture.Assign(JPG);

如果您从 shell 复制文件,剪贴板将不包含文件的内容,而只包含文件名。

因此,您需要获取此文件名,然后使用它来加载您的图像。

这是一个小例子,只包含一个 TImage 控件:

procedure TForm1.FormClick(Sender: TObject);
begin

  if Clipboard.HasFormat(CF_HDROP) then
  begin

    Clipboard.Open;
    try
      var LDrop := Clipboard.GetAsHandle(CF_HDROP);
      if LDrop <> 0 then
      begin
        var LFileCount := DragQueryFile(LDrop, $FFFFFFFF, nil, 0);
        if LFileCount = 1 then
        begin
          var LSize := DragQueryFile(LDrop, 0, nil, 0);
          if LSize <> 0 then
          begin
            var LFileName: string;
            SetLength(LFileName, LSize);
            if DragQueryFile(LDrop, 0, PChar(LFileName), LFileName.Length + 1) <> 0 then
              Image1.Picture.LoadFromFile(LFileName);
          end;
        end;
      end;
    finally
      Clipboard.Close;
    end;

  end;

end;

注:ClipboardClipbrd中声明,DragQueryFileShellAPI中声明。