首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> Delphi

Delphi 剪貼簿基礎 (2):圖片複製粘貼與格式檢查(Assign/HasFormat)

     編輯:Delphi

核心場景

在 Delphi 中實現圖片的「複製到剪貼簿 → 從剪貼簿粘貼繪製」是最常見的剪貼簿應用。關鍵在於:使用 TPicture/TPicture.Assign 通用圖片容器,配合 HasFormat(CF_BITMAP) 安全檢查。

完整實戰代碼(健壯版)

界面元素

  • Image1: TImage(放在 Panel1 上,用於載入源圖片)
  • btnLoad:載入圖片文件
  • btnCopy:複製到剪貼簿
  • btnPaste:從剪貼簿粘貼繪製到窗體 Canvas

單元代碼

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls;

type
  TForm1 = class(TForm)
    Panel1: TPanel;
    Image1: TImage;
    btnLoad: TButton;
    btnCopy: TButton;
    btnPaste: TButton;
    procedure FormCreate(Sender: TObject);
    procedure btnLoadClick(Sender: TObject);
    procedure btnCopyClick(Sender: TObject);
    procedure btnPasteClick(Sender: TObject);
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

uses Clipbrd;

procedure TForm1.FormCreate(Sender: TObject);
begin
  // 佈局初始化
  Panel1.Align := alTop;
  Panel1.Height := 200;
  Image1.Align := alClient;
  Image1.Proportional := True; // 保持比例縮放顯示
  Image1.Stretch := False;

  btnLoad.Caption := '載入圖片';
  btnCopy.Caption := '複製到剪貼簿';
  btnPaste.Caption := '從剪貼簿粘貼繪製';
end;

procedure TForm1.btnLoadClick(Sender: TObject);
begin
  with TOpenDialog.Create(Self) do
  try
    Filter := '圖片文件|*.bmp;*.jpg;*.jpeg;*.png;*.gif;*.tif|所有文件|*.*';
    if Execute then
    begin
      Image1.Picture.LoadFromFile(FileName);
      btnLoad.Caption := '已載入: ' + ExtractFileName(FileName);
    end;
  finally
    Free;
  end;
end;

procedure TForm1.btnCopyClick(Sender: TObject);
begin
  // 防禦性檢查:無圖片不複製
  if Image1.Picture.Graphic = nil then
  begin
    ShowMessage('請先載入圖片');
    Exit;
  end;

  // 核心:TPicture.Assign 會自動處理各種 Graphic 子類轉換
  Clipboard.Assign(Image1.Picture);
  btnCopy.Caption := '已複製 (可在畫圖中粘貼)';
end;

procedure TForm1.btnPasteClick(Sender: TObject);
var
  BMP: TBitmap;
  X, Y: Integer;
begin
  // 關鍵安全檢查:剪貼簿必須包含位圖格式
  if not Clipboard.HasFormat(CF_BITMAP) then
  begin
    ShowMessage('剪貼簿中無位圖數據 (CF_BITMAP)');
    Exit;
  end

  BMP := TBitmap.Create;
  try
    // 從剪貼簿讀取(Assign 內部調用 GetAsHandle 等)
    BMP.Assign(Clipboard);

    // 計算繪製位置:Panel 右側空白區
    X := Panel1.Left + Panel1.Width + 10;
    Y := Panel1.Top + 10;

    // 直接繪製到窗體 Canvas(演示用,實際應繪製到持久化畫布如 TImage)
    Canvas.Draw(X, Y, BMP);
  finally
    BMP.Free;
  end;

  btnPaste.Caption := '已繪製到窗體';
end;

end.

關鍵技術點深度解析

1. Clipboard.Assign(Source) 的多態威力

TClipboard.Assign 重載接受 TPersistent。傳入 TPicture 時,內部會:

  1. 檢查 Picture.Graphic 類型(TBitmap、TJPEGImage、TPNGImage 等)。
  2. 自動轉換為 Windows 標準位圖格式(CF_BITMAP)或 DIB(CF_DIB)放入剪貼簿。
  3. 同時保留原始格式(如 PNG 的透明通道)作為私有格式,支援 Delphi 間無損粘貼。

2. HasFormat(CF_BITMAP):安全粘貼的守門員

  • CF_BITMAP = 2(Windows 標準位圖句柄格式)。
  • 若剪貼簿含文本、文件列表、自定義格式但無位圖,直接 Assign 會拋異常或產生空圖片。
  • 最佳實踐:粘貼前必須檢查 HasFormat。

3. 常見剪貼簿格式常數對照表

Delphi 還定義:CF_COMPONENT(組件流)、CF_PRINTERS 等私有格式。

4. 繪製目標選擇:Canvas.Draw vs TImage

示例為演示直接繪製到 Form.Canvas,但窗體重繪會丟失。生產代碼應:

  • 繪製到 TImage.Picture.Bitmap.Canvas(持久化)。
  • 或用 TPaintBox.OnPaint 事件中重繪。
  • 或維護 TBitmap 列表作為文檔模型。

進階:支援透明通道的 PNG 複製粘貼

uses PngImage; // 需在 uses 添加

procedure TForm1.btnCopyClick(Sender: TObject);
var
  PNG: TPNGImage;
begin
  if Image1.Picture.Graphic = nil then Exit;

  // 強制以 PNG 格式放入剪貼簿(保留 Alpha 通道)
  PNG := TPNGImage.Create;
  try
    PNG.Assign(Image1.Picture.Graphic);
    Clipboard.Assign(PNG); // 放入 CF_PNG (私有) + CF_DIB (無透明)
  finally
    PNG.Free;
  end;
end;

procedure TForm1.btnPasteClick(Sender: TObject);
var
  PNG: TPNGImage;
begin
  // 檢查私有 PNG 格式(需註冊或用已知 ID)
  if Clipboard.HasFormat(Clipboard.FormatNameToID('PNG')) then
  begin
    PNG := TPNGImage.Create;
    try
      PNG.Assign(Clipboard); // 獲得帶透明通道的 PNG
      // 使用 PNG.Draw(Canvas, Rect) 正確合成透明度
    finally
      PNG.Free;
    end;
  end
  else if Clipboard.HasFormat(CF_BITMAP) then
    // 回退到位圖
    ...
end;

總結

Delphi 圖片剪貼簿操作核心公式:Clipboard.Assign(Picture) 複製 + HasFormat(CF_BITMAP) 檢查 + Bitmap.Assign(Clipboard) 粘貼。掌握 TPicture 多態容器、格式常數、防禦性檢查、持久化繪製目標,即可構建專業級圖片編輯、截圖工具、文檔處理功能。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
常數值說明
CF_TEXT1ANSI 文本
CF_BITMAP2位圖句柄 (HBITMAP)
CF_METAFILEPICT3元文件圖片
CF_DIB8設備無關位圖 (DIB)
CF_PALETTE9調色板
CF_UNICODETEXT13Unicode 文本
CF_HDROP15文件拖放列表
CF_DIBV517DIB V5 (含色彩空間)