Moin!
Zitat von
Dani:
1. Wenn ich mit TBitmap.LoadFromFile eine .DIB Datei lade, ist HandleType immer bmDDB.
Nicht bei mir - vielleicht haben deine Bitmaps die du lädst wirklich keine Farbpalette und sind wirklich DDB ?
Zitat von
Dani:
2. TBitmap kapselt zwar HBITMAP usw., aber wenn ich mit GetDIBits an die Bitmap Bits kommen will muss ich einen neuen Bitmap-Daten-Puffer einrichten. Das ist Speicher-Verschwendung.
Wie kommst du darauf, das TBitmap einen solchen Puffer beinhaltet? TBitmap hat einen solchen Puffer nicht und besorgt ihn sich wenn nur temporär wenn er ihn benötigt, wobei ich nichtmal eine Situation kenne wo er dies überhaupt macht (Ausser InternalGetDIB() in Graphics.pas und CopyBitmap() in der gleichen
Unit). Du kannst dir also ohne Bedenken diesen Puffer anlegen und dir die Daten holen.
Zitat von
Dani:
3. Wozu mit GetDIBits ein DDB in ein DIB umwandeln, wenn man von Anfang an mit DIBs arbeiten kann?
Gute Frage, wie gesagt: bei mir sind es keine DDB's sondern DIB's wenn ich welche lade, etc.
Zitat von
Dani:
Zitat von
Muetze1:
Und wieso brauchst du sowas zum ausdrucken? Das übliche Problem, dass BitBlt() und StretchBlt() nicht von jedem Druckertreiber unterstützt werden?
Genau das. =)
Dazu benutze ich folgenden Code und der arbeitet auf allen Druckern einwandfrei:
Delphi-Quellcode:
Procedure PrintPicture(ABitmap : TBitmap);
// from: [url]http://www.scalabium.com/faq/dct0090.htm[/url]
Var
Info: PBitmapInfo;
InfoSize: DWORD;
Image: Pointer;
ImageSize: DWORD;
Bits: HBITMAP;
ScaleX, ScaleY: Integer;
DIBWidth, DIBHeight: LongInt;
Begin
Printer.BeginDoc;
Try
Canvas.Lock;
Try
{ Paint bitmap to the printer }
With Printer
Do
Begin
Bits := ABitmap.Handle;
ScaleX := GetDeviceCaps(
Handle, logPixelsX)
div PixelsPerInch;
ScaleY := GetDeviceCaps(
Handle, logPixelsY)
div PixelsPerInch;
GetDIBSizes(Bits, InfoSize, ImageSize);
Info := AllocMem(InfoSize);
Try
Image := AllocMem(ImageSize);
Try
GetDIB(Bits, 0, Info^, Image^);
With Info^.bmiHeader
Do
Begin
DIBWidth := biWidth;
DIBHeight := biHeight;
End;
StretchDIBits(Canvas.Handle, 0, 0, DIBWidth*ScaleX, DIBHeight*ScaleY, 0, 0,
DIBWidth, DIBHeight, Image, Info^, DIB_RGB_COLORS, SRCCOPY);
Finally
FreeMem(Image, ImageSize);
End;
Finally
FreeMem(Info, InfoSize);
End;
End;
Finally
Canvas.Unlock;
End;
Finally
Printer.EndDoc;
End;
End;
MfG
Muetze1