![]() |
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 |
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 |
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ß |
Re: DPI - Eintrag im BMP-File-Header angeben.
Eigentlich recht einfach:
Delphi-Quellcode:
...:cat:...
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; P.S.: Ist aus dem Kopf, anstatt Write evtl. WriteBuffer oder so :zwinker: P.P.S.: Dec->Hex :shock: |
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:
Probier das mal aus.
FS.Write(10000, 4);
Gruß xaromz |
Re: DPI - Eintrag im BMP-File-Header angeben.
Danke!
Ich werde das heute noch testen und euch sagen ob's hingehauen hat! gruß |
Re: DPI - Eintrag im BMP-File-Header angeben.
Ich habe es noch ein wenig korrigiert und dabei xaromz' Vorschlag aufgegriffen:
Delphi-Quellcode:
Gruß Hawkeye
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; |
Re: DPI - Eintrag im BMP-File-Header angeben.
Zitat:
...:cat:... |
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) ;) |
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 08:08 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz