Sources
Delphi Russian Knowledge Base
DRKB - это самая большая и удобная в использовании база знаний по Дельфи в рунете, составленная Виталием Невзоровым

Как копировать и вставлять картинки через буфер обмена?

01.01.2007

Некоторые функции для копирования и вставки Bitmap-объектов через буфер обмена.

function CopyClipToBuf(DC: HDC; Left, Top, Width, Height: Integer;  Rop: LongInt; var CopyDC: HDC; var CopyBitmap: HBitmap): Boolean;
var
 
TempBitmap: HBitmap;
begin
 
Result := False;
 
CopyDC := 0;
 
CopyBitmap := 0;
 
if DC <> 0 then
   
begin
     
CopyDC := CreateCompatibleDC(DC);
     
if CopyDC <> 0 then
       
begin
         
CopyBitmap := CreateCompatibleBitmap(DC, Width, Height);
         
if CopyBitmap <> 0 then
           
begin
             
TempBitmap := CopyBitmap;
             
CopyBitmap := SelectObject(CopyDC, CopyBitmap);
             
Result := BitBlt(CopyDC, 0, 0, Width, Height, DC, Left, Top, Rop);
             
CopyBitmap := TempBitmap;
           
end;
       
end;
   
end;
end;
function CopyBufToClip(DC: HDC; var CopyDC: HDC; var CopyBitmap: HBitmap; 
           
Left, Top, Width, Height: Integer;
           
Rop: LongInt; DeleteObjects: Boolean): Boolean;
var
 
TempBitmap: HBitmap;
begin
 
Result := False;
 
if (DC <> 0) and (CopyDC <> 0) and (CopyBitmap <> 0) then
   
begin
     
TempBitmap := CopyBitmap;
     
CopyBitmap := SelectObject(DC, CopyBitmap);
     
Result := BitBlt(DC, Left, Top, Width, Height, CopyDC, 0, 0, Rop);
     
CopyBitmap := TempBitmap;
     
if DeleteObjects then
       
begin
         
DeleteDC(CopyDC);
         
DeleteObject(CopyBitmap);
       
end;
   
end;
end;

Ниже приведен код, позволяющий скопировать панель. Для вырезания части изображения необходимо знать размеры и координаты вырезаемого прямоугольника, и заменить значения width, height, left и top, приведенные в коде, на реальные. Если вы действительно хотите вырезать, а не копировать область, то вам понадобиться ее залить с помощью вызова функции fillrect.

Var
 
BitMap: TBitmap;
begin
 
BitMap:=TBitMap.Create;
 
BitMap.Height:=BaseKeyPanel.Height;
 
BitMap.Width:=BaseKeyPanel.Width;
 
BitBlt(BitMap.Canvas.Handle, 0 {Лево}, 0{Top},
 
BaseKeyPanel.Width, BaseKeyPanel.Height,
 
GetDC(BaseKeyPanel.Handle), 0, 0, SRCCOPY);
 
Clipboard.Assign(BitMap);
 
BitMap.Free;
End;

Взято с https://delphiworld.narod.ru


Clipboard.Assign(Image1.Picture);  
https://delphiworld.narod.ru/

DelphiWorld 6.0

// Copy form1 as bitmap into the clipboard 
 
procedure TForm1
.Button1Click(Sender: TObject);
 
var
   imgWindow
: TBitmap;
 
begin
   imgWindow
:= GetFormImage;
   
try
     
Clipboard.Assign(imgWindow);
   
finally
     imgWindow
.Free;
   
end;
 
end;
 
 
// Save the bitmap to a file
// Das Bitmap in einer Datei speichern:
 
procedure TForm1
.Button2Click(Sender: TObject);
 
var
   imgWindow
: TBitmap;
 
begin
   imgWindow
:= TBitmap.Create;
   
try
     imgWindow
:= Form1.GetFormImage;
     imgWindow
.SaveToFile('c:\FormImage.bmp');
   
finally
     imgWindow
.Free;
   
end;
 
end;
 

Взято с сайта: https://www.swissdelphicenter.ch


{ 
 
In order to run this example you will need the GR32 Unit from the package
 http
://www.g32.org/files/graphics32/graphics32-1_5_1.zip
 to run
this example.
}
 
 unit EG_ClipboardBitmap32
;
 
{
 
Author William Egge. egge@eggcentric.com
 
January 17, 2002
 
Compiles with ver 1.2 patch #1 of Graphics32
 
 
This unit will copy and paste Bitmap32 pixels to the clipboard and retain the
  alpha channel
.
 
 
The clipboard data will still work with regular paint programs because this
  unit adds a
new format only for the alpha channel and is kept seperate from
  the regular bitmap storage
.
}
 
 
interface
 
 uses
   
ClipBrd, Windows, SysUtils, GR32;
 
 procedure CopyBitmap32ToClipboard
(const Source: TBitmap32);
 procedure PasteBitmap32FromClipboard
(const Dest: TBitmap32);
 
function CanPasteBitmap32: Boolean;
 
 implementation
 
 
const
   
RegisterName = 'G32 Bitmap32 Alpha Channel';
   
GlobalUnlockBugErrorCode = ERROR_INVALID_PARAMETER;
 
 
var
   
FAlphaFormatHandle: Word = 0;
 
 procedure
RaiseSysError;
 
var
   
ErrCode: LongWord;
 
begin
   
ErrCode := GetLastError();
   
if ErrCode <> NO_ERROR then
     
raise Exception.Create(SysErrorMessage(ErrCode));
 
end;
 
 
function GetAlphaFormatHandle: Word;
 
begin
   
if FAlphaFormatHandle = 0 then
   
begin
     
FAlphaFormatHandle := RegisterClipboardFormat(RegisterName);
     
if FAlphaFormatHandle = 0 then
       
RaiseSysError;
   
end;
   
Result := FAlphaFormatHandle;
 
end;
 
 
function CanPasteBitmap32: Boolean;
 
begin
   
Result := Clipboard.HasFormat(CF_BITMAP);
 
end;
 
 procedure CopyBitmap32ToClipboard
(const Source: TBitmap32);
 
var
   H
: HGLOBAL;
   
Bytes: LongWord;
   P
, Alpha: PByte;
   I
: Integer;
 
begin
   
Clipboard.Assign(Source);
   
if not OpenClipboard(0) then
     
RaiseSysError
   
else
     
try
       
Bytes := 4 + (Source.Width * Source.Height);
       H
:= GlobalAlloc(GMEM_MOVEABLE and GMEM_DDESHARE, Bytes);
       
if H = 0 then
         
RaiseSysError;
       P
:= GlobalLock(H);
       
if P = nil then
         
RaiseSysError
       
else
         
try
           
PLongWord(P)^ := Bytes - 4;
           
Inc(P, 4);
           
// Copy Alpha into Array
         
Alpha := Pointer(Source.Bits);
           
Inc(Alpha, 3); // Align with Alpha
         
for I := 1 to (Source.Width * Source.Height) do
           
begin
             P
^ := Alpha^;
             
Inc(Alpha, 4);
             
Inc(P);
           
end;
         
finally
           
if (not GlobalUnlock(H)) then
             
if (GetLastError() <> GlobalUnlockBugErrorCode) then
               
RaiseSysError;
         
end;
       
SetClipboardData(GetAlphaFormatHandle, H);
     
finally
       
if not CloseClipboard then
         
RaiseSysError;
     
end;
 
end;
 
 procedure PasteBitmap32FromClipboard
(const Dest: TBitmap32);
 
var
   H
: HGLOBAL;
   
ClipAlpha, Alpha: PByte;
   I
, Count, PixelCount: LongWord;
 
begin
   
if Clipboard.HasFormat(CF_BITMAP) then
   
begin
     
Dest.BeginUpdate;
     
try
       
Dest.Assign(Clipboard);
       
if not OpenClipboard(0) then
         
RaiseSysError
       
else
         
try
           H
:= GetClipboardData(GetAlphaFormatHandle);
           
if H <> 0 then
           
begin
             
ClipAlpha := GlobalLock(H);
             
if ClipAlpha = nil then
               
RaiseSysError
             
else
               
try
                 
Alpha := Pointer(Dest.Bits);
                 
Inc(Alpha, 3); // Align with Alpha
               
Count := PLongWord(ClipAlpha)^;
                 
Inc(ClipAlpha, 4);
                 
PixelCount := Dest.Width * Dest.Height;
                 
Assert(Count = PixelCount,
                   
'Alpha Count does not match Bitmap pixel Count, PasteBitmap32FromClipboard(const Dest: TBitmap32);');
 
                 
// Should not happen, but if it does then this is a safety catch.
               
if Count > PixelCount then
                   
Count := PixelCount;
 
                 
for I := 1 to Count do
                 
begin
                   
Alpha^ := ClipAlpha^;
                   
Inc(Alpha, 4);
                   
Inc(ClipAlpha);
                 
end;
               
finally
                 
if (not GlobalUnlock(H)) then
                   
if (GetLastError() <> GlobalUnlockBugErrorCode) then
                     
RaiseSysError;
               
end;
           
end;
         
finally
           
if not CloseClipboard then
             
RaiseSysError;
         
end;
     
finally
       
Dest.EndUpdate;
       
Dest.Changed;
     
end;
   
end;
 
end;
 
 
end.
 
 
 
// Example Call:
 
{uses
  JPEG
;}
 
 procedure TForm1
.Button1Click(Sender: TObject);
 
var
   bmp
: TBitmap32;
 
begin
   bmp
:= TBitmap32.Create;
   
try
     bmp
.LoadFromFile('C:\test.jpg');
     CopyBitmap32ToClipboard
(bmp);
   
finally
     bmp
.Free;
   
end;
 
end;
 
 

Взято с сайта: https://www.swissdelphicenter.ch