AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Frage(n) zu Device Independent Bitmaps
Thema durchsuchen
Ansicht
Themen-Optionen

Frage(n) zu Device Independent Bitmaps

Ein Thema von Dani · begonnen am 4. Dez 2004 · letzter Beitrag vom 5. Dez 2004
Antwort Antwort
Benutzerbild von Dani
Dani

Registriert seit: 19. Jan 2003
732 Beiträge
 
Turbo Delphi für Win32
 
#1

Frage(n) zu Device Independent Bitmaps

  Alt 4. Dez 2004, 23:46
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
Dani H.
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#2

Re: Frage(n) zu Device Independent Bitmaps

  Alt 5. Dez 2004, 02:12
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
  Mit Zitat antworten Zitat
Benutzerbild von Dani
Dani

Registriert seit: 19. Jan 2003
732 Beiträge
 
Turbo Delphi für Win32
 
#3

Re: Frage(n) zu Device Independent Bitmaps

  Alt 5. Dez 2004, 12:06
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. =)
Dani H.
  Mit Zitat antworten Zitat
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
Benutzerbild von Dani
Dani

Registriert seit: 19. Jan 2003
732 Beiträge
 
Turbo Delphi für Win32
 
#5

Re: Frage(n) zu Device Independent Bitmaps

  Alt 5. Dez 2004, 15:21
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...
Angehängte Dateien
Dateityp: zip dib.zip (6,9 KB, 8x aufgerufen)
Dani H.
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#6

Re: Frage(n) zu Device Independent Bitmaps

  Alt 5. Dez 2004, 21:51
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 von test.dib:
HandleType:
bmDDB

Y-DPI (sollte 300 sein):
96

Ungefähre Ladezeit:
00:078
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
  Mit Zitat antworten Zitat
Benutzerbild von Dani
Dani

Registriert seit: 19. Jan 2003
732 Beiträge
 
Turbo Delphi für Win32
 
#7

Re: Frage(n) zu Device Independent Bitmaps

  Alt 5. Dez 2004, 22:14
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


Vielen vielen Dank für die Hilfe Muetze1!!! Ich wusste gar nicht, dass man Bitmaps überhaupt im device dependent Format abspeichern kann...
Dani H.
At Least I Can Say I Tried
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:24 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