(CodeLib-Manager)
Registriert seit: 10. Jun 2002
4.648 Beiträge
Delphi XE Professional
|
Re: Wie kann ich die Farbtiefe verringern?
29. Mär 2006, 19:55
Hallo,
Bei mir funktioniert's so ausgezeichnet:
Delphi-Quellcode:
procedure ScreenShot(x: Integer; // Bild Koordinaten
y: Integer;
Width: Integer;
Height: Integer;
PixelFormat: TPixelFormat; // Bit Format
bm: TBitMap); // Ziel Bitmap
const
CAPTUREBLT = $40000000; // Für transparente Fenster
var
dc: HDC;
lpPal: PLOGPALETTE;
begin
{Breite und Höhe testen}
if ((Width = 0) or
(Height = 0)) then
Exit;
bm.Width := Width;
bm.Height := Height;
bm.PixelFormat := PixelFormat;
{Handle des Anzeige-Gerätekontextes ermitteln}
dc := GetDc(0);
if ( dc = 0) then
Exit;
{Haben wir einen Paletten-Gerätekontext?}
if (GetDeviceCaps( dc, RASTERCAPS) and
RC_PALETTE = RC_PALETTE) then
begin
{Speicher für eine logische Palette reservieren}
GetMem(lpPal,
SizeOf(TLOGPALETTE) +
(255 * SizeOf(TPALETTEENTRY)));
FillChar(lpPal^,
SizeOf(TLOGPALETTE) +
(255 * SizeOf(TPALETTEENTRY)),
#0);
{Die Palette-Version setzen}
lpPal^.palVersion := $300;
{Die System Paletten Einträge ermitteln}
lpPal^.palNumEntries :=
GetSystemPaletteEntries( dc,
0,
256,
lpPal^.palPalEntry);
if (lpPal^.PalNumEntries <> 0) then
{Die Palette erzeugen}
bm.Palette := CreatePalette(lpPal^);
FreeMem(lpPal, SizeOf(TLOGPALETTE) +
(255 * SizeOf(TPALETTEENTRY)));
end;
{Vom Screen aufs Bitmap kopieren}
BitBlt(bm.Canvas.Handle,
0,
0,
Width,
Height,
Dc,
x,
y,
SRCCOPY or CAPTUREBLT);
{Gerätekontext wieder freigeben}
ReleaseDc(0, dc);
end;
procedure TForm1.Button1Click(Sender: TObject);
var
BMP: TBitmap;
begin
BMP := TBitmap.Create;
try
ScreenShot(0, 0, Screen.Width, Screen.Height, pf8bit, BMP);
BMP.SaveToFile(' c:\testbmp.bmp');
finally
BMP.Free;
end;
end;
Thomas
|
|
Zitat
|