AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi Bitmap mit bestimmter DPI erstellen
Thema durchsuchen
Ansicht
Themen-Optionen

Bitmap mit bestimmter DPI erstellen

Ein Thema von TUX_der_Pinguin · begonnen am 15. Mai 2009 · letzter Beitrag vom 19. Mai 2009
Antwort Antwort
Seite 1 von 2  1 2      
TUX_der_Pinguin

Registriert seit: 1. Jun 2005
Ort: Anholt (NRW)
608 Beiträge
 
Delphi 11 Alexandria
 
#1

Bitmap mit bestimmter DPI erstellen

  Alt 15. Mai 2009, 07:52
Hi DPler,

ich bastel mal wieder an einem Rave Projekt rum, ich habe einen Report mit einer Bitmap Komponente desen größe ist 180mm x 125 mm
jetzt möchte ich ein Bild an diese Komponente übergeben, dazu erstelle ich ein Bitmap und fange an darauf "rum zu malen". Alles
wunderbar jetzt geht es nur um die größe des Bitmaps. Erstell ich ein Bitmap so hat dieses Bitmap 96 DPI aber das ist zu
wenig, das Bild sieht nachher total pixelig aus, darum dachte ich ich erstelle das Bild mit 600 DPI.

Will ich also ein Bild mit der größe 18 x 12,5 cm bei 600 Dpi haben so muß dieses 4252 x 2953 pixel groß sein.
Die Formel dazu lautet pixel = mm * (dpi / 25,4), Beispiel: 4252 = 180 * (600 / 25,4).

Alles kein Problem nur hat mein erstelltes Bild immer noch eine Dpi von 96 und nicht 600. Ich brauche ein Bitmap oder
irgendeine Zeichenfläche die ich mit 600 Dpi erstellen kann, anschließend auf 1/10 mm Einteilung einstellen kann.
Um darauf in mm Angaben zu zeichnen. Damit ich direkt erblicken kann wie groß wird das was ich zeichne auf dem Report.


Mein bisheriger Versuch:
Delphi-Quellcode:
 Bitmap := TBitmap.Create;
  try
    try
      //Farbtiefe
      Bitmap.PixelFormat := pf4bit;

      //Größe des Bitmaps
      Bitmap.SetSize(Round(180 * (600 / 25.4)), Round(125 * (600 / 25.4)));

      //Bitmap in 1/10 mm Einteilung
      OutDC := Bitmap.Canvas.Handle;
      SetMapMode(OutDC,MM_LOMETRIC);
      GetWindowExtEx(OutDC,w);
      GetViewportExtEx(OutDC,v);
      SetMapMode(OutDC,MM_ANISOTROPIC);
      SetWindowExtEx(OutDC,w.cx,w.cy,nil);
      SetViewPortExtEx(OutDC,v.cx,-v.cy,nil);

      //Ränder-Einstellungen
      L_Margin := 0;
      T_Margin := 0;

      //Der Teil wird nicht benötigt, da es keinen Mindestrand gibt wie bei einem Drucker
      //OffSetX := GetDevicecaps(OutDC,PHYSICALOFFSETX) / GetDevicecaps(OutDC,LOGPIXELSX) * 25.4;
      //OffSetY := GetDevicecaps(OutDC,PHYSICALOFFSETY) / GetDevicecaps(OutDC,LOGPIXELSY) * 25.4;
      //L_Margin := LeftMargin - Round((OffSetX*10));
      //T_Margin := TopMargin - Round((OffSetY*10));

      //Bild 1
      With Graph1.Draw Do Begin
        Pos.Left := L_Margin+50;
        Pos.Top := T_Margin;
        Pos.Width := 850;
        Pos.Height := 550;

        Margin.Top := 50; {Abstand zum oberen Rand}
        Margin.Left := 120; {Abstand zum linken Rand}
        Margin.Right := 90; {Abstand zum rechten Rand}
        Margin.Bottom := 50; {Abstand zum unteren Rand}

        Font := TFont.Create;
        Font.Name := 'Arial';
        Font.Height := 32;
        Font.Style := [];

        LabelDist.X := 10;
        LabelDist.Y := 10;

        DPI.Horz := GetDeviceCaps(OutDC, LOGPIXELSX);
        DPI.Vert := GetDeviceCaps(OutDC, LOGPIXELSY);
      End;{with Graph1.Draw}

      //Bild 2
      With Graph2.Draw Do Begin
        Pos.Left := L_Margin+50+870;
        Pos.Top := T_Margin;
        Pos.Width := 850;
        Pos.Height := 550;

        Margin.Top := 50; {Abstand zum oberen Rand}
        Margin.Left := 120; {Abstand zum linken Rand}
        Margin.Right := 90; {Abstand zum rechten Rand}
        Margin.Bottom := 50; {Abstand zum unteren Rand}

        Font := TFont.Create;
        Font.Name := 'Arial';
        Font.Height := 32;
        Font.Style := [];

        LabelDist.X := 10;
        LabelDist.Y := 10;

        DPI.Horz := GetDeviceCaps(OutDC, LOGPIXELSX);
        DPI.Vert := GetDeviceCaps(OutDC, LOGPIXELSY);
      End;{with}

      //Bild 3
      With Graph3.Draw Do Begin
        Pos.Left := L_Margin+50;
        Pos.Top := T_Margin+570;
        Pos.Width := 1720;
        Pos.Height := 550;

        Margin.Top := 50; {Abstand zum oberen Rand}
        Margin.Left := 120; {Abstand zum linken Rand}
        Margin.Right := 90; {Abstand zum rechten Rand}
        Margin.Bottom := 50; {Abstand zum unteren Rand}

        Font := TFont.Create;
        Font.Name := 'Arial';
        Font.Height := 32;
        Font.Style := [];

        LabelDist.X := 10;
        LabelDist.Y := 10;

        DPI.Horz := GetDeviceCaps(OutDC, LOGPIXELSX);
        DPI.Vert := GetDeviceCaps(OutDC, LOGPIXELSY);
      End;{with}

      //Grafik zeichnen...
      pGraph_Draw(Bitmap.Canvas, True);

      //Speichern...
      Bitmap.SaveToFile(glLocalAppDir+'bla.bmp');

      //Bild in Report laden...
      MemStream := TMemoryStream.Create;
      try
        Bitmap.SaveToStream(MemStream);
        Connection.WriteBlobData(MemStream.Memory^, MemStream.Size);
      finally
        MemStream.Free;
      end;

    except
      on EOutOfResources do begin
        Application.MessageBox(PAnsiChar(fGetText(10212)), PAnsiChar(fGetText(MSG_ERROR)), 48);
        //Close;
      end;
    end;{try..except}

  finally
    Bitmap.Free;
  end;{try..finally}
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.755 Beiträge
 
Delphi 10.4 Sydney
 
#2

Re: Bitmap mit bestimmter DPI erstellen

  Alt 15. Mai 2009, 08:01
Guten Morgen,

ein Bild hat keine dpi.
Die Dimension eines Bildes wird in Pixel angegeben.

Die Dots per Inch kommen ins Spiel wenn Du das Bild ausgeben willst.
Der Bildschirm hat in der Regel 96DPI ein Drucker 300dpi oder mehr.

Grüße
Klaus
Klaus
  Mit Zitat antworten Zitat
TUX_der_Pinguin

Registriert seit: 1. Jun 2005
Ort: Anholt (NRW)
608 Beiträge
 
Delphi 11 Alexandria
 
#3

Re: Bitmap mit bestimmter DPI erstellen

  Alt 15. Mai 2009, 08:06
Zitat von Klaus01:
Guten Morgen,

ein Bild hat keine dpi.
Die Dimension eines Bildes wird in Pixel angegeben.

Die Dots per Inch kommen ins Spiel wenn Du das Bild ausgeben willst.
Der Bildschirm hat in der Regel 96DPI ein Drucker 300dpi oder mehr.

Grüße
Klaus
Das weiß ich, nur wieso gibt dann ein ShowMessage(IntToStr(GetDevicecaps(OutDC,LOGPIXELS X))); 96 aus wenn ein Bitmap eigentlich
keine DPI hat. Desweiteren will ich in einem Bild welches aus Pixel besteht etwas zeichnen mit Angaben in mm oder cm, so brauche
ich doch immer die Information Dpi, damit ich weiß wie viele Pixel sind den jetzt 1 cm z.B.
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.542 Beiträge
 
Delphi 11 Alexandria
 
#4

Re: Bitmap mit bestimmter DPI erstellen

  Alt 15. Mai 2009, 08:09
Schau Dir mal SetMapMode an.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.755 Beiträge
 
Delphi 10.4 Sydney
 
#5

Re: Bitmap mit bestimmter DPI erstellen

  Alt 15. Mai 2009, 08:10
Zitat von TUX_der_Pinguin:
Zitat von Klaus01:
Guten Morgen,

ein Bild hat keine dpi.
Die Dimension eines Bildes wird in Pixel angegeben.

Die Dots per Inch kommen ins Spiel wenn Du das Bild ausgeben willst.
Der Bildschirm hat in der Regel 96DPI ein Drucker 300dpi oder mehr.

Grüße
Klaus
Das weiß ich, nur wieso gibt dann ein ShowMessage(IntToStr(GetDevicecaps(OutDC,LOGPIXELS X))); 96 aus wenn ein Bitmap eigentlich
keine DPI hat. Desweiteren will ich in einem Bild welches aus Pixel besteht etwas zeichnen mit Angaben in mm oder cm, so brauche
ich doch immer die Information Dpi, damit ich weiß wie viele Pixel sind den jetzt 1 cm z.B.
Weil GetDeviceCaps Information des Ausgabegerätes ausgibt und nicht des Bitmaps.
Und dein Monitor hat 96dpi.

Grüße
Klaus
Klaus
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.542 Beiträge
 
Delphi 11 Alexandria
 
#6

Re: Bitmap mit bestimmter DPI erstellen

  Alt 15. Mai 2009, 08:11
Genau. Eine Bitmap hat x * y Pixel, in welcher Auflösung die ausgegeben werden, ist Sache des Ausgabegerätes.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
TUX_der_Pinguin

Registriert seit: 1. Jun 2005
Ort: Anholt (NRW)
608 Beiträge
 
Delphi 11 Alexandria
 
#7

Re: Bitmap mit bestimmter DPI erstellen

  Alt 15. Mai 2009, 08:19
Ja aber was tu ich dann um ein Bild mit 18 x 12,5 cm zu bekommen auf dem ich rum zeichnen kann in mm Angaben, um dieses
Bild an meinen Report zu übergeben. Also ist das nicht möglich oder was. Ich frage mich wie das Photoshop und co. machen
in einem Bildbearbeitungsprogramm kann ich doch ein Bild mit beliebiger DPI erstellen.
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.755 Beiträge
 
Delphi 10.4 Sydney
 
#8

Re: Bitmap mit bestimmter DPI erstellen

  Alt 15. Mai 2009, 08:35
.. Du musst wissen auf welchen Medium (und desssen dpi) Dein Report ausgegeben wird.
Wenn Dein Report auf dem Bildschirm ausgegeben werden soll,
dann kannst Du mit den ermittelten 96dpi rechnen.
Wenn Dein Report auf dem Drucker ausgegeben werden soll solltest
Du mit den dpi des Druckers rechnen.

Grüße
Klaus
Klaus
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.679 Beiträge
 
Delphi 2007 Enterprise
 
#9

Re: Bitmap mit bestimmter DPI erstellen

  Alt 15. Mai 2009, 10:21
Zitat von Klaus01:
.. Du musst wissen auf welchen Medium (und desssen dpi) Dein Report ausgegeben wird.
Auf mir wird nix ausgegeben!


Letztlich musst du einfach wissen mit wie viel DPI du es nachher zu tun hast. Wenn du das weisst, dann brauchst du um 1cm in einem Bitmap abzubilden DPI/2,54 Pixel.

Ein 18x12,5cm Bild müsste auf einem 600DPI Drucker also mit einem Bitmap mit 18*600/2,54 x 12,5*600/2,54 ~= 4252x2953 Pixeln erstellt werden um die volle Auflösung zu nutzen.
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
TUX_der_Pinguin

Registriert seit: 1. Jun 2005
Ort: Anholt (NRW)
608 Beiträge
 
Delphi 11 Alexandria
 
#10

Re: Bitmap mit bestimmter DPI erstellen

  Alt 15. Mai 2009, 11:09
Zitat von Klaus01:
.. Du musst wissen auf welchen Medium (und desssen dpi) Dein Report ausgegeben wird.
Wenn Dein Report auf dem Bildschirm ausgegeben werden soll,
dann kannst Du mit den ermittelten 96dpi rechnen.
Wenn Dein Report auf dem Drucker ausgegeben werden soll solltest
Du mit den dpi des Druckers rechnen.

Grüße
Klaus

Ahja und wieso kann ich ein Bitmap in einem Grafikprogramm erzeugen mit einer bestimmten DPI zahl,
da gebe ich auch nirgendwo an auf welchem Medium es landet.

Zweitens der Report soll entweder gedruckt oder als PDF erzeugt werden, und selbst wenn ich weiß
welche DPI der Drucker hat wie erzeuge ich dann das Bitmap? Und die DPI eines PDFs ist sicherlich
auch nicht greifbar und selbst wenn weiß ich immer noch nicht wie ich dieses Bitmap im Speicher generieren soll
mit der entsprechenden größe. Ich kann ja schlecht erst auf "Printer.Canvas" etwas zeichnen und es dann in mein
Bitmap kopieren, was sowieso nicht gehen soll da ich irgendwo gelesen habe Printer.Canvas ist nur beschreibbar
nicht lesbar.

Um es noch mal ganz einfach zu erklären, ich möchte eine Linie zeichnen von ca. 2 cm länge oder breite wie auch immer.
Diese Linie soll auf einem Report erscheinen die dafür vorgesehene Fläche beträgt 18 x 12,5 cm. Und dafür sind 96 DPI
einfach zu wenig, ich brauche mehr Details da es um ein Koordinaten system mit einer Kurve und Skalenstrichen etc. geht.



Zitat von Medium:
Letztlich musst du einfach wissen mit wie viel DPI du es nachher zu tun hast. Wenn du das weisst, dann brauchst du um 1cm in einem Bitmap abzubilden DPI/2,54 Pixel.

Ein 18x12,5cm Bild müsste auf einem 600DPI Drucker also mit einem Bitmap mit 18*600/2,54 x 12,5*600/2,54 ~= 4252x2953 Pixeln erstellt werden um die volle Auflösung zu nutzen.
Siehe mein 1. Posting dort habe ich schon geschrieben das das Bitmap eine größe von ca. 4252x2953 Pixeln haben muß.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 06:14 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