Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Bitmap mit bestimmter DPI erstellen (https://www.delphipraxis.net/134077-bitmap-mit-bestimmter-dpi-erstellen.html)

DeddyH 15. Mai 2009 11:13

Re: Bitmap mit bestimmter DPI erstellen
 
Was heißt denn DPI? Dots Per Inch, also Pixel pro Zoll. Du kannst ja nur die Pixel festlegen und nicht, wieviele davon in einem Zoll dargestellt werden, das ist Sache des Ausgabegeräts.

Mithrandir 15. Mai 2009 11:26

Re: Bitmap mit bestimmter DPI erstellen
 
Zitat:

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

Boah, immer diese Klugscheißer. :wall: Du gibts auch nicht das Medium an, sondern die Zahl der DPI und die Größe der Zeichenfläche. Daraus kann man (=Photoshop, Gimp, wer-auch-immer) die Größe des Bildes in Pixel berechnen.

Wikipedia: DPI

Zitat:

In Bilddateien in den Formaten BMP, JPG und TIFF ist es möglich, im Dateiheader eine relative Auflösung anzugeben. Nicht alle Programme unterstützen jedoch diese Möglichkeit.
Im Regelfall werden diese aber nicht genutzt. Es ist also lediglich ein mathematisches Problem. Du musst einfach nur hin und her rechnen.

Zitat:

Alles kein Problem nur hat mein erstelltes Bild immer noch eine Dpi von 96 und nicht 600
Nein, dein Bild hat gar keine DPI. Die Werte werden, wie im verlinkten Beitrag gezeigt, selten oder nie in die Datei geschrieben. Es ist Sache des Ausgabegeräts, ob es ein Bild von 32x32 Pixel in einer Breite von 50 cm oder von 5 cm druckt. Wenn man will, dass das Bild bei einer Breite von 50 cm genau so aussieht (vom Detailreichtum her) wie bei 5 cm, so braucht das Bild eine höhere Auflösung.

Eigentlich ganz logisch.

brechi 15. Mai 2009 12:13

Re: Bitmap mit bestimmter DPI erstellen
 
Liste der Anhänge anzeigen (Anzahl: 2)
Da es um ein Bitmap geht, kann eine DPI Anzahl angegeben werden. Diese kann dann genutzt um auf jedem Ausgabemedium das Bild in der gleiche Größe darzustellen. Es ist halt eine zusätzliche Angabe. Ein Bild mit DPI 96 und 1000 Pixeln hat eben eine Größe von X-cm unabhängig von dem Ausgabemedium.

Genau diese Info kann eben genutzt werden, damit das Bild auf jedem beliebigen Drucker (ob 100DPI oder 1200DPI) gleich groß ausgedruckt wird. Die meisten Bildprogramme nuten das auch.
Siehe Irfanview -> Resize/Resample image -> DPI

Und der Threadersteller will wohl diese Eigenschaft im Bitmap-Header setzen.

Laut
http://www.fastgraph.com/help/bmp_header_format.html
ist es:
38 horizontal resolution in pixels per meter (unreliable)
42 vertical resolution in pixels per meter (unreliable)


Es wird vom Druckertreiber verwendet, folgendes zeigt den Unterschied beim Ausdrucken (beides 100*100 Pixel, einmal 72 oder 96DPI und einmal 300DPI).

@Daniel
"Im Dateiheader eine relative Auflösung anzugeben. Nicht alle Programme unterstützen jedoch diese Möglichkeit"
- "Im Regelfall werden diese aber nicht genutzt."

Sie wird benutzt, kann nur in vielen Programmen nicht angegeben werden. Aber Photoshop, Gimp, Paint.Net etc. unterstützen das. Und dann wirds auch im Ausdruck verwendet.

Medium 15. Mai 2009 14:32

Re: Bitmap mit bestimmter DPI erstellen
 
Die Angabe im Bitmap ist lediglich ein Hinweis, mit dessen Hilfe ein Ausgabemedium das Bild so skalieren kann, dass es so groß (in cm) wird wie es vom Ersteller vorgesehen ist. D.h. du kannst im Grunde dein Bitmap so fein auflösen wie du magst, du musst nur die DPI Einträge entsprechend mit anpassen. Dafür müsstest du wie es scheint an den MSDN-Library durchsuchenBITMAPINFOHEADER heran kommen, der so wie ich das überblicke von der VCL nicht durchgereicht wird. Mit dem Handle (HBITMAP) sollte sich aber etwas anstellen lassen. Hier ist es übrigens keine DPI- sondern Pixels-per-Meter Angabe.
Und dann musst du noch das Glück haben, dass das Bild nachher von einem Programm verwendet wird, dass diese Angabe berücksichtigt.

Am Rande: Dein Ton kommt etwas arg gereizt rüber - nichts womit sich Sympathiepunkte gewinnen lassen :)

TUX_der_Pinguin 19. Mai 2009 10:17

Re: Bitmap mit bestimmter DPI erstellen
 
So nach lagem hin und her und herrumprobieren, habe ich eine lösung gefunden mit der ich zwar nicht ganz zufrieden bin.
Ich habe mein halbes Programm umgestrickt damit es klappt, ich rechne jetzt überall immer selbst die 1/10 mm in Pixel um.

D.h. ich erstelle mein Bitmap mit 18x12,5cm was 4252x2953 Pixeln entspricht. Und zeichne ich eine Linie so sähe das wie folgt aus.

Delphi-Quellcode:
with Bitmap.Canvas do begin
  LineTo(fMmToPx(0, 600), fMmToPx(10, 600));
  MoveTo(fMmToPx(100, 600), fMmToPx(10, 600));
end;
Die funktion fMmToPx():

Delphi-Quellcode:
function fMmToPx(mm, DPI: Integer) : Integer;
begin
  result := Round(((mm / 100) * DPI) / 2.54);
end;
So das ganze klappt jetzt auch soweit, jedoch ist die Grafik noch sehr pixelig, bzw. linien sind nachher je nach Zoom im PDF Reader
nicht sichtbar. Lasse ich das PDF wie früher über einen PDF Drucker erstellen, kommen die linien stärker durch und auch die Texte
sind nicht mehr pixelig.

Ich habe gelesen das ein Bitmap wenn es einem Report übergeben wird als JPEG umgewandelt wird, läßt sich da irgendwas beeinflussen
in Ritung AntiAliasing !?

Oder gibt es irgendwie direkt eine möglichkeit auf einem Report zur Laufzeit zu zeichnen?

TUX_der_Pinguin 19. Mai 2009 11:07

Re: Bitmap mit bestimmter DPI erstellen
 
Ein Versuch die Grafikqualität zu erhöhen. Ich habe einen Versuch gestartet das ganze mit MetaFile umzusetzen, die Qualität
ist da durch auch enorm gestiegen. Jedoch ist das MetaFile auch irgendwie pixelig und nachher im Report/PDF auch.

Die Dateigröße des PDF ist auch viel zu viel, ein Ausdruck mit einem PDF drucker brachte eine Dateigröße von ca. 40 KB
und der Weg über den Rave Report bringt eine Datei mit einer größe von > 400 KB.

Delphi-Quellcode:
procedure TfrmGraph.RvCustConTAGraphGetRow(Connection: TRvCustomConnection);
var
  MemStream  : TMemoryStream;
  DotsPerInch : Word;
  Wmf        : TMetaFile;
  WmfCanvas  : TMetaFileCanvas;

begin
  //init
  DotsPerInch := RvRenderPDF.MetafileDPI;

  Wmf := TMetaFile.Create;
  try
    try
      //Größe
      Wmf.SetSize(fMmToPx(1800, DotsPerInch), fMmToPx(1220, DotsPerInch));
     
      //Zeichenfläche erstellen
      WmfCanvas := TMetaFileCanvas.Create(Wmf, 0);
      try

        //Bild 1
        with Graph1.Draw do begin
          Pos.Left     := fMmToPx(40, DotsPerInch);
          Pos.Top      := fMmToPx(50, DotsPerInch);
          Pos.Width    := fMmToPx(850, DotsPerInch);
          Pos.Height   := fMmToPx(550, DotsPerInch);

          Margin.Top   := fMmToPx(50, DotsPerInch); //Abstand zum oberen Rand
          Margin.Left  := fMmToPx(120, DotsPerInch); //Abstand zum linken Rand
          Margin.Right := fMmToPx(90, DotsPerInch); //Abstand zum rechten Rand
          Margin.Bottom := fMmToPx(50, DotsPerInch); //Abstand zum unteren Rand

          Font         := TFont.Create;
          Font.Name    := 'Arial';
          Font.Height  := fMmToPx(32, DotsPerInch);
          Font.Style   := [];

          LabelDist.X  := fMmToPx(10, DotsPerInch);
          LabelDist.Y  := fMmToPx(10, DotsPerInch);

          DPI.Horz     := DotsPerInch;
          DPI.Vert     := DotsPerInch;
        end;{with Graph1.Draw}

        //Bild 2
        with Graph2.Draw do begin
          Pos.Left     := fMmToPx(870+40, DotsPerInch);
          Pos.Top      := fMmToPx(50, DotsPerInch);
          Pos.Width    := fMmToPx(850, DotsPerInch);
          Pos.Height   := fMmToPx(550, DotsPerInch);

          Margin.Top   := fMmToPx(50, DotsPerInch); //Abstand zum oberen Rand
          Margin.Left  := fMmToPx(120, DotsPerInch); //Abstand zum linken Rand
          Margin.Right := fMmToPx(90, DotsPerInch); //Abstand zum rechten Rand
          Margin.Bottom := fMmToPx(50, DotsPerInch); //Abstand zum unteren Rand

          Font         := TFont.Create;
          Font.Name    := 'Arial';
          Font.Height  := fMmToPx(32, DotsPerInch);
          Font.Style   := [];

          LabelDist.X  := fMmToPx(10, DotsPerInch);
          LabelDist.Y  := fMmToPx(10, DotsPerInch);

          DPI.Horz     := DotsPerInch;
          DPI.Vert     := DotsPerInch;
        end;{with}

        //Bild 3
        with Graph3.Draw do begin
          Pos.Left     := fMmToPx(40, DotsPerInch);
          Pos.Top      := fMmToPx(570+50, DotsPerInch);
          Pos.Width    := fMmToPx(1720, DotsPerInch);
          Pos.Height   := fMmToPx(550, DotsPerInch);

          Margin.Top   := fMmToPx(50, DotsPerInch); //Abstand zum oberen Rand
          Margin.Left  := fMmToPx(120, DotsPerInch); //Abstand zum linken Rand
          Margin.Right := fMmToPx(90, DotsPerInch); //Abstand zum rechten Rand
          Margin.Bottom := fMmToPx(50, DotsPerInch); //Abstand zum unteren Rand

          Font         := TFont.Create;
          Font.Name    := 'Arial';
          Font.Height  := fMmToPx(32, DotsPerInch);
          Font.Style   := [];

          LabelDist.X  := fMmToPx(10, DotsPerInch);
          LabelDist.Y  := fMmToPx(10, DotsPerInch);

          DPI.Horz     := DotsPerInch;
          DPI.Vert     := DotsPerInch;      
        end;{with}

        //Grafik zeichnen...
        pGraph_Draw(WmfCanvas, False, True);

      finally
        WmfCanvas.Free;
      end;

      Wmf.SaveToFile(glLocalAppDir+'bla.wmf'); //Die Datei ist ca. 507 KB groß

      //Bild in Report laden...
      MemStream := TMemoryStream.Create;
      try
        Wmf.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
    Wmf.Free;
  end;{try..finally}

end;

TUX_der_Pinguin 19. Mai 2009 11:08

Re: Bitmap mit bestimmter DPI erstellen
 
Eintrag doppelt!

TUX_der_Pinguin 19. Mai 2009 11:23

Re: Bitmap mit bestimmter DPI erstellen
 
Eintrag doppelt


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:04 Uhr.
Seite 2 von 2     12   

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