Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Frage(n) zu Device Independent Bitmaps (https://www.delphipraxis.net/35290-frage-n-zu-device-independent-bitmaps.html)

Dani 4. Dez 2004 23:46


Frage(n) zu Device Independent Bitmaps
 
Hi,

ich möchte gerne Bitmaps ausdrucken, dazu brauche ich DIBs und die Win32API Funktion StretchDIBits. Wie's aussieht bringt die VCL keine vernünftige Klasse mit, die man dazu benutzen könnte. Was ich brauche wäre quasi ein TBitmap mit LoadFromFile, Canvas usw. aber halt für DIBs und mit Zeiger auf Info-Header und Bits-Daten.

TBitmap.HandleType := bmDIB bringt leider gar nichts. Gibts da eine brauchbare Lösung? :?


Gruß,
Dani

Muetze1 5. Dez 2004 02:12

Re: Frage(n) zu Device Independent Bitmaps
 
Moin!

Hä? Wo ist denn das Problem? TBitmap kapselt doch nur ein HBITMAP inklusive einer DC, PEN und Brush. Wenn du z.B. GetDIBits() aufrufen willst, dann gib ihm doch einfach Bitmap.Handle - das ist doch das HBITMAP Handle was du dafür brauchst.

Ich kapier irgendwie die Frage nicht...

Und wieso brauchst du sowas zum ausdrucken? Das übliche Problem, dass BitBlt() und StretchBlt() nicht von jedem Druckertreiber unterstützt werden?

MfG
Muetze1

Dani 5. Dez 2004 12:06

Re: Frage(n) zu Device Independent Bitmaps
 
Zitat:

Hä? Wo ist denn das Problem?
Das Problem ist, dass TBitmap nicht "richtig" funktioniert.

1. Wenn ich mit TBitmap.LoadFromFile eine .DIB Datei lade, ist HandleType immer bmDDB.

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.

3. Wozu mit GetDIBits ein DDB in ein DIB umwandeln, wenn man von Anfang an mit DIBs arbeiten kann?

Zitat:

Und wieso brauchst du sowas zum ausdrucken? Das übliche Problem, dass BitBlt() und StretchBlt() nicht von jedem Druckertreiber unterstützt werden?
Genau das. =)

Muetze1 5. Dez 2004 13:56

Re: Frage(n) zu Device Independent Bitmaps
 
Moin!

Zitat:

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:

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:

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:

Zitat von Dani
Zitat:

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

Dani 5. Dez 2004 15:21

Re: Frage(n) zu Device Independent Bitmaps
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von Muetze1
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.

Irgendwo im Speicher müssen die Bitmap-Daten doch rumliegen. Wie kann man sonst die lange Ladezeit erklären? Und was, wenn man auf TBitmap.Canvas zeichnet?

Vielleicht stimmt ja was mit meinen gespeicherten DIBs nicht (benutze Micrografx PicturePublisher). Würde mich interessieren, was das kleine Programm im Anhang mit Test.dib bei dir ausgibt...

Muetze1 5. Dez 2004 21:51

Re: Frage(n) zu Device Independent Bitmaps
 
Moin!

Also die Ladezeit kommt nur durch das DDB zustande, wenn ich eine DIB lade, habe ich egal wie gross, immer 0:000 Sekunden Ladezeit. Dann ist mir die Abfrage der DPI Zahl nicht geheuer - da ist es doch fast logisch, dass dort eine an den Bildschirm angepasste DPI Zahl kommt, schliesslich müsste sonst das ganze umgerechnet werden bei jeder Aktion.

Und dein Bitmap ist wirklich ein DDB und enthält keine Palette und ist daher device dependent.

Zitat:

Zitat von test.dib
HandleType:
bmDDB

Y-DPI (sollte 300 sein):
96

Ungefähre Ladezeit:
00:078

Zitat:

Zitat von _test_.bmp
HandleType:
bmDIB

Y-DPI (sollte 300 sein):
96

Ungefähre Ladezeit:
00:000

Ich habe dein Bild mal ganz einfach mit Paint in ein DIB gewandelt und dabei kam denn ein 8 MB File raus (256 Farben) und da ist dann der Nachteil von Paint, da Paint nicht komprimiert. RLE hätte hier viel gebracht und wäre auf deine Bildgrösse gekommen...

MfG
Muetze1

Dani 5. Dez 2004 22:14

Re: Frage(n) zu Device Independent Bitmaps
 
So, habe jetzt auch mal mit Paint ein neues Bitmap erstellt und gespeichert. Siehe da es ist ein DIB. Werde mich jetzt mal nach einem anderen (besseren?) Grafikprogramm umsehen :wall:


Vielen vielen Dank für die Hilfe Muetze1!!! Ich wusste gar nicht, dass man Bitmaps überhaupt im device dependent Format abspeichern kann...


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:21 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz