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 2 von 2     12   
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.622 Beiträge
 
Delphi 12 Athens
 
#11

Re: Bitmap mit bestimmter DPI erstellen

  Alt 15. Mai 2009, 12:13
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.
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
Benutzerbild von Mithrandir
Mithrandir
(CodeLib-Manager)

Registriert seit: 27. Nov 2008
Ort: Delmenhorst
2.379 Beiträge
 
#12

Re: Bitmap mit bestimmter DPI erstellen

  Alt 15. Mai 2009, 12:26
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. 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.
米斯蘭迪爾
"In einer Zeit universellen Betruges wird das Aussprechen der Wahrheit zu einem revolutionären Akt." -- 1984, George Orwell
  Mit Zitat antworten Zitat
brechi

Registriert seit: 30. Jan 2004
823 Beiträge
 
#13

Re: Bitmap mit bestimmter DPI erstellen

  Alt 15. Mai 2009, 13:13
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.
Angehängte Grafiken
Dateityp: bmp bmp1_669.bmp (10,8 KB, 30x aufgerufen)
Dateityp: bmp bmp2_147.bmp (10,8 KB, 17x aufgerufen)
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.686 Beiträge
 
Delphi 2007 Enterprise
 
#14

Re: Bitmap mit bestimmter DPI erstellen

  Alt 15. Mai 2009, 15:32
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
"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)
609 Beiträge
 
Delphi 11 Alexandria
 
#15

Re: Bitmap mit bestimmter DPI erstellen

  Alt 19. Mai 2009, 11:17
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?
  Mit Zitat antworten Zitat
TUX_der_Pinguin

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

Re: Bitmap mit bestimmter DPI erstellen

  Alt 19. Mai 2009, 12:07
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;
  Mit Zitat antworten Zitat
TUX_der_Pinguin

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

Re: Bitmap mit bestimmter DPI erstellen

  Alt 19. Mai 2009, 12:08
Eintrag doppelt!
  Mit Zitat antworten Zitat
TUX_der_Pinguin

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

Re: Bitmap mit bestimmter DPI erstellen

  Alt 19. Mai 2009, 12:23
Eintrag doppelt
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


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 23:19 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