Einzelnen Beitrag anzeigen

Muetze1
(Gast)

n/a Beiträge
 
#4

Re: Frage(n) zu Device Independent Bitmaps

  Alt 5. Dez 2004, 13:56
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
  Mit Zitat antworten Zitat