Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi DPI - Eintrag im BMP-File-Header angeben. (https://www.delphipraxis.net/71899-dpi-eintrag-im-bmp-file-header-angeben.html)

bitboy0 22. Jun 2006 10:23


DPI - Eintrag im BMP-File-Header angeben.
 
Ich habe ein kleines Werkzeug erstellt um Bilder in einer bestimmten Art und Weise vorzubreiten. Das geht auch alles ganz gut, aber beim Import in ein Bildverarbeitungsprogramm wird das Bild erst mal extrem zu groß angezeigt weil im Standard-File-Header als Größenangabe 72DPI steht.

Damit das Bild in der richtigen Art und Weise geöffnet wird muss ich nur mit einem Hex-Editor den Eintrag im File-Header auf 1200 dpi setzen... also das sind 4 Byte die zu ändern sind.

Da Delphi wohl keine Möglichkeit vorsieht einem BMP einen anderen DPI-Wert als 72 mitzugeben suche ich jetzt eine simple Methode um nach dem Speichern des Bildes einfach den Wert dieser 4 Byte nachträglich durch den gewünschten Wert zu ersetzen.

Weil ich hier schon ein paar Themen durchsucht habe... ich brauche den Wert obwohl die meisten Programme den nicht auswerten und obwohl das mit der Qualität auch nichts zu tun hat. Die Pixelanzahl im Bild ändert sich durch den DPI-Wert im Header nicht, aber beim Import der Bilder nach Corel-Draw muss ich ohne den richtigen Wert erst mal noch jedes Bild von Hand verkleinern... das ist lästig!

Gruß Sven

xaromz 22. Jun 2006 11:11

Re: DPI - Eintrag im BMP-File-Header angeben.
 
Hallo,

erstmal: Herzlich Willkommen! :party:

Lade doch das Bild einfach in einen Stream und ändere die Werte. Das Offset weißst Du ja wohl schon.

Gruß
xaromz

bitboy0 22. Jun 2006 11:48

Re: DPI - Eintrag im BMP-File-Header angeben.
 
Ja, offset ist einmal 38 und dann 42 (dezimal)
Die Angabe ist jeweils ein 4-Byte-Wert für die Horizontale und Vertikale Auflösung und damit es nicht zu einfach ist hat man hier den Wert in Pixel pro METER einzugeben... also bei 254dpi sind dann hier 10000 (00 00 27 10) einzutragen.. aber auch noch in umgekehrter Reihenfolge ... also (10 27 00 00) ...

Das alles weis ich ... nur hab ich noch keine Ahnung wie man einen Stream öffnet um an einer bekannten Stelle diese Bytes zu ändern. Da ich grade in Istanbul hocke und meine Delphi-Bücher in Mannheim im Büro stehen wäre ich SEHR dankbar wenn mir jemand die paar benötigten Zeilen für

Stream öffnen (Dateiname ist bekannt)
Position im Stream angeben
Byte schreiben
Stream schliessen

hier fertig posten könnte... Das steht sicher als Beispiel irgendwo in einem meiner Bücher ... :oops:

gruß

sakura 22. Jun 2006 12:20

Re: DPI - Eintrag im BMP-File-Header angeben.
 
Eigentlich recht einfach:
Delphi-Quellcode:
var
  FS: TFileStream;
begin
  ..

  FS := TFileStream.Create(DateiName, fmOpenWrite);
  try
    FS.Position := 28;
    FS.Write($10, 1);
    FS.Write($27, 1);
    FS.Write($00, 1);
    FS.Write($00, 1);
    FS.Write($10, 1);
    FS.Write($27, 1);
    FS.Write($00, 1);
    FS.Write($00, 1);
  finally
    FS.Free;
  end;
...:cat:...

P.S.: Ist aus dem Kopf, anstatt Write evtl. WriteBuffer oder so :zwinker:
P.P.S.: Dec->Hex :shock:

xaromz 22. Jun 2006 12:28

Re: DPI - Eintrag im BMP-File-Header angeben.
 
Hallo,

zu sakuras Beitrag: Du hast natürlich die Hex-Werte geschrieben, aber sakura schreibt Dezimalwerte. Aufpassen also.
Kann es eigentlich sein, dass die Byte-Reihenfolge stimmt, wenn man einfach einen Integer schreibt (ich kann mir die Byte-Reihenfolge immer nicht merken):
Delphi-Quellcode:
FS.Write(10000, 4);
Probier das mal aus.

Gruß
xaromz

bitboy0 22. Jun 2006 13:40

Re: DPI - Eintrag im BMP-File-Header angeben.
 
Danke!

Ich werde das heute noch testen und euch sagen ob's hingehauen hat!

gruß

Hawkeye219 22. Jun 2006 13:59

Re: DPI - Eintrag im BMP-File-Header angeben.
 
Ich habe es noch ein wenig korrigiert und dabei xaromz' Vorschlag aufgegriffen:
Delphi-Quellcode:
var
  Value : Cardinal;
begin
  Value := 10000;
  with TFileStream.Create(Dateiname, fmOpenWrite) do
    try
      Position := 38;  // 38, nicht 28 ;-)
      Write(Value, 4); // Write benötigt eine Variable
      Write(Value, 4);
    finally
      Free;
    end;
end;
Gruß Hawkeye

sakura 22. Jun 2006 14:13

Re: DPI - Eintrag im BMP-File-Header angeben.
 
Zitat:

Zitat von xaromz
zu sakuras Beitrag: Du hast natürlich die Hex-Werte geschrieben, aber sakura schreibt Dezimalwerte.

:duck: :oops: Korrigiert. Wie peinlich!!!

...:cat:...

bitboy0 22. Jun 2006 14:47

Re: DPI - Eintrag im BMP-File-Header angeben.
 
Super einfach das ganze! Danke!

Ich habs so rüberkopiert und es hat SOFORT perfekt funktioniert!

Ausserdem finde ich das Klima hier sehr freundlich!!

gruß (Aus Istanbul) ;)

bitboy0 23. Jun 2006 08:16

Re: DPI - Eintrag im BMP-File-Header angeben.
 
Kurzer Nachtrag...

Der Typ für "VALUE" ist dann INTEGER ... mit Caption oder Double schreibt er unbrauchbare Werte in das File... da stören wohl die Nachkommestellen.

gruß


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:24 Uhr.
Seite 1 von 2  1 2      

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