[gelöst] Kommandozeilenprogramm zur Reduzierung der Farbtiefe bei Windows-Bitmaps

Rund um die LCL und andere Komponenten
kirchfritz
Beiträge: 128
Registriert: Mo 3. Jan 2011, 13:34
OS, Lazarus, FPC: Win10 (L 2.2.2 FPC 3.2.2)
CPU-Target: 64Bit
Wohnort: Nürnberg

[gelöst] Kommandozeilenprogramm zur Reduzierung der Farbtiefe bei Windows-Bitmaps

Beitrag von kirchfritz »

Hallo BGRA-Spezialisten!

ich möchte gerne mit Lazarus und den BGRA-Komponenten ein Kommandozeilenprogramm schreiben um bei meinen Windows-Bitmapdateien die Farbtiefe von 24 Bit auf 8 Bit zu reduzieren.
Kann mir ein BGRA-Spezialist eventuell bei der Erstellung des 5-Zeilers helfen?

Bisher habe ich das hier:

Code: Alles auswählen

program Project1;
uses SysUtils;
{$R *.res}
var
  inputFilename : String;
  outputFilename : String;

begin
  // Wenn kein Prtogrammparameter übergeben wurde, dann Programm sofort beenden.
  if ParamCount <> 1 then
     exit;
  inputFilename := ParamStr(1);
  outputFilename := ChangeFileExt(inputFilename,'_8Bit.BMP');
  // Wenn die Datei existiert und es eine BMP-Datei sein sollte,....
  if Fileexists(inputFilename) and  (ExtractFileExt(Uppercase(inputFilename)) = '.BMP') then
  begin
    {???????}
  end;
end.
   
Mir ist bewusst, dass es für diese Aufgabenstellung diverse fertige Programme gibt (ImageMagik, MSPaint, GIMP usw.) , aber ich will mein eigenes Lazarus-Programm dafür schreiben, mit dem Ziel, BGRA-Bitmaps besser zu verstehen.

Viele Grüße
Fritz
Zuletzt geändert von kirchfritz am Do 17. Nov 2022, 19:59, insgesamt 1-mal geändert.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 5483
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Niederösterreich
Kontaktdaten:

Re: Kommandozeilenprogramm zur Reduzierung der Farbtiefe bei Windows-Bitmaps

Beitrag von af0815 »

Vielleicht mal die Wiki https://wiki.freepascal.org/BGRABitmap und https://wiki.freepascal.org/BGRABitmap_tutorial nach Beispielen durchsuchen.

Dann einfach mal die Routinen zum Anzeigen am Canvas weglassen.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

kirchfritz
Beiträge: 128
Registriert: Mo 3. Jan 2011, 13:34
OS, Lazarus, FPC: Win10 (L 2.2.2 FPC 3.2.2)
CPU-Target: 64Bit
Wohnort: Nürnberg

Re: Kommandozeilenprogramm zur Reduzierung der Farbtiefe bei Windows-Bitmaps

Beitrag von kirchfritz »

Ich mache kleine Fortschritte:

Code: Alles auswählen

program BitmapConverter;
uses
  Classes, SysUtils, Graphics, Interfaces,
  BGRABitmap, BGRABitmapTypes;
{$R *.res}
var
  inputFilename : String;
  outputFilename : String;
  image : TBGRABitmap;

begin
  // Wenn kein Programmparameter übergeben wurde, dann Programm sofort beenden.
  if ParamCount <> 1 then
     exit;
  inputFilename := ParamStr(1);
  outputFilename := ChangeFileExt(inputFilename,'_8Bit.BMP');
  // Wenn die Datei existiert und es eine BMP-Datei sein sollte,....
  if Fileexists(inputFilename) and  (ExtractFileExt(Uppercase(inputFilename)) = '.BMP') then
  begin
    image := TBGRABitmap.Create(inputFilename);
    {???????}
    image.SaveToFile(outputFilename);
    image.Free;
  end;
end.
Ich kann die InputDatei schon mal in ein TBGRABitmap laden und unter neuem Namen abspeichern.
Jetzt bräuchte ich nur Hilfe bei der Umwandlung zur geforderten Farbtiefe von 256 Farben.
Welcher BGRA-Spezialist kann mir dabei helfen?

kirchfritz
Beiträge: 128
Registriert: Mo 3. Jan 2011, 13:34
OS, Lazarus, FPC: Win10 (L 2.2.2 FPC 3.2.2)
CPU-Target: 64Bit
Wohnort: Nürnberg

Re: Kommandozeilenprogramm zur Reduzierung der Farbtiefe bei Windows-Bitmaps

Beitrag von kirchfritz »

af0815 hat geschrieben:
Mi 16. Nov 2022, 10:51
Vielleicht mal die Wiki https://wiki.freepascal.org/BGRABitmap und https://wiki.freepascal.org/BGRABitmap_tutorial nach Beispielen durchsuchen.

Dann einfach mal die Routinen zum Anzeigen am Canvas weglassen.
16 Tutorials durchzulesen wollte ich ebenhalt vermeiden. Ich bin ebenhalt faul und dachte mir, wenn es da draussen einen BGRA-Spezialisten gibt, dann weiß der das auf Anhieb.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 5483
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Niederösterreich
Kontaktdaten:

Re: Kommandozeilenprogramm zur Reduzierung der Farbtiefe bei Windows-Bitmaps

Beitrag von af0815 »

Weil das Umwandeln zu den eher schwereren Disziplinen gehört. Aber du hast zumindest angefangen dich mit BGRABitmap zu beschäftigen.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

kirchfritz
Beiträge: 128
Registriert: Mo 3. Jan 2011, 13:34
OS, Lazarus, FPC: Win10 (L 2.2.2 FPC 3.2.2)
CPU-Target: 64Bit
Wohnort: Nürnberg

Re: Kommandozeilenprogramm zur Reduzierung der Farbtiefe bei Windows-Bitmaps

Beitrag von kirchfritz »

af0815 hat geschrieben:
Mi 16. Nov 2022, 11:38
Weil das Umwandeln zu den eher schwereren Disziplinen gehört. Aber du hast zumindest angefangen dich mit BGRABitmap zu beschäftigen.
jetzt warte ich nur noch auf Antworten von BGRA-Spezialisten.

Benutzeravatar
theo
Beiträge: 9580
Registriert: Mo 11. Sep 2006, 19:01

Re: Kommandozeilenprogramm zur Reduzierung der Farbtiefe bei Windows-Bitmaps

Beitrag von theo »

Ich bin nicht sicher, ob BGRABitmap Code dafür hat, jedenfalls würde dann der Name nicht mehr passen. :wink:

8 Bit Grafiken benutzen Farbpaletten, D.h. jedes Pixel besteht aus einem Index auf diese Palette.
Es werden also nicht die Farbwerte direkt gespeichert, sondern nur der Zeiger auf einen Paletteneintrag, also eine von 256 Farben.

Mein altes OPBitmap hat für diese Umwandlung von 32bit auf 8 oder 4 Bit relativ aufwändige Prozeduren in TColorQuantizer, aber wenn du BGRABitmap lernen willst, hilft dir das nicht weiter.
Eine Aufgabe dabei ist ja erst einmal, die optimale Palette für das jeweilige Bild zu erstellen, ausser wir reden von Graustufen.

kirchfritz
Beiträge: 128
Registriert: Mo 3. Jan 2011, 13:34
OS, Lazarus, FPC: Win10 (L 2.2.2 FPC 3.2.2)
CPU-Target: 64Bit
Wohnort: Nürnberg

Re: Kommandozeilenprogramm zur Reduzierung der Farbtiefe bei Windows-Bitmaps

Beitrag von kirchfritz »

theo hat geschrieben:
Mi 16. Nov 2022, 12:07
Ich bin nicht sicher, ob BGRABitmap Code dafür hat, jedenfalls würde dann der Name nicht mehr passen. :wink:

8 Bit Grafiken benutzen Farbpaletten, D.h. jedes Pixel besteht aus einem Index auf diese Palette.
Es werden also nicht die Farbwerte direkt gespeichert, sondern nur der Zeiger auf einen Paletteneintrag, also eine von 256 Farben.

Mein altes OPBitmap hat für diese Umwandlung von 32bit auf 8 oder 4 Bit relativ aufwändige Prozeduren in TColorQuantizer, aber wenn du BGRABitmap lernen willst, hilft dir das nicht weiter.
Eine Aufgabe dabei ist ja erst einmal, die optimale Palette für das jeweilige Bild zu erstellen, ausser wir reden von Graustufen.
Ich rede nicht von Graustufen! Ich dachte mir nur, BGRABitmap wäre der richtige Ansatz diese Aufgabe zu lösen.
Wenn es mit anderen Komponenten oder anderen Pascal Prozeduren besser geht, dann nur zu.
Und so ganz weltfremd scheint mir meine Aufgabe auch nicht zu sein.
Müsste doch schon mal jemand programmiert haben.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 5483
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Niederösterreich
Kontaktdaten:

Re: Kommandozeilenprogramm zur Reduzierung der Farbtiefe bei Windows-Bitmaps

Beitrag von af0815 »

kirchfritz hat geschrieben:
Mi 16. Nov 2022, 12:23
Müsste doch schon mal jemand programmiert haben.
viewtopic.php?f=29&t=434 falls du OPBitmap suchst :-) Weil es geht ja eher um eine fertige Lösung zum lernen.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Benutzeravatar
Winni
Beiträge: 1423
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: Kommandozeilenprogramm zur Reduzierung der Farbtiefe bei Windows-Bitmaps

Beitrag von Winni »

kirchfritz hat geschrieben:
Mi 16. Nov 2022, 10:33
um bei meinen Windows-Bitmapdateien die Farbtiefe von 24 Bit auf 8 Bit zu reduzieren.
Kann mir ein BGRA-Spezialist eventuell bei der Erstellung des 5-Zeilers helfen?

Hi!

Erstmal: was ist das Ziel?

Bitmaps mit Pallette und 8 Bit Tiefe waren zuletzt Anfang der 90er von Bedeutung: Trotz wenig Speicher gab's bunte Bilder.

So etwas ist heute höchstens noch in Embeded Systems sinnvoll. Die Zeit des Speichermangels und der langsamen Prozessoren ist vorbei.

Also : was ist das Ziel?

BGRA-Bitmap kann zwar 8-Bit-Bitmaps lesen, wandelt sie aber sofort in 32-Bit um. Insofern ist BGRA nicht der richtige Ansatz. Kommt nämlich aus diesem Jahrtausend im Ggs zu 8-Bit-Bitmaps.

Winni

Benutzeravatar
theo
Beiträge: 9580
Registriert: Mo 11. Sep 2006, 19:01

Re: Kommandozeilenprogramm zur Reduzierung der Farbtiefe bei Windows-Bitmaps

Beitrag von theo »

af0815 hat geschrieben:
Mi 16. Nov 2022, 12:40
viewtopic.php?f=29&t=434 falls du OPBitmap suchst :-) Weil es geht ja eher um eine fertige Lösung zum lernen.
Naja, das Ganze Teil ist jetzt vielleicht ein bisschen happig für diesen Zweck.
Ich könnte Kirchfritz das Wesentliche extrahieren für den Job (3 Dateien).

Aber Winni hat schon auch recht.
Ich möchte auch gerne wissen wozu.
So richtig sinnvoll ist das heute allgemein nicht mehr.

EDIT: Hab's mal angehängt. Das müsste so laufen, ohne Package etc.
Dateianhänge
bmpconvert8.zip
(167.44 KiB) 4-mal heruntergeladen

kirchfritz
Beiträge: 128
Registriert: Mo 3. Jan 2011, 13:34
OS, Lazarus, FPC: Win10 (L 2.2.2 FPC 3.2.2)
CPU-Target: 64Bit
Wohnort: Nürnberg

Re: Kommandozeilenprogramm zur Reduzierung der Farbtiefe bei Windows-Bitmaps

Beitrag von kirchfritz »

Winni hat geschrieben:
Mi 16. Nov 2022, 12:52
kirchfritz hat geschrieben:
Mi 16. Nov 2022, 10:33
um bei meinen Windows-Bitmapdateien die Farbtiefe von 24 Bit auf 8 Bit zu reduzieren.
Kann mir ein BGRA-Spezialist eventuell bei der Erstellung des 5-Zeilers helfen?

Hi!

Erstmal: was ist das Ziel?

Bitmaps mit Pallette und 8 Bit Tiefe waren zuletzt Anfang der 90er von Bedeutung: Trotz wenig Speicher gab's bunte Bilder.

So etwas ist heute höchstens noch in Embeded Systems sinnvoll. Die Zeit des Speichermangels und der langsamen Prozessoren ist vorbei.

Also : was ist das Ziel?

BGRA-Bitmap kann zwar 8-Bit-Bitmaps lesen, wandelt sie aber sofort in 32-Bit um. Insofern ist BGRA nicht der richtige Ansatz. Kommt nämlich aus diesem Jahrtausend im Ggs zu 8-Bit-Bitmaps.

Winni
Ziel ist es, Bitmaps mit 8 Bit Farbtiefe für die Verwendung in SAP Smartforms zur Verfügung zustellen.
SAP Smartforms akzeptieren leider nur 8 Bit Farbtiefe. Alles andere wird konsequent von SAP abgelehnt.
Mag sein, dass SAP an den Bitmap-Formaten der 90er Jahren festhält.
Nur ändern kann ich an dieser Meinung von SAP leider nichts.
SAP will, dass Ich Bitmaps mit 8 Bit Farbtiefe abliefere.
Und ich habe auch im Internet schon Meinungen gefunden, dass SAP selbst sagen soll, wie solche Bitmaps zu erstellen wäre.
Nun vertreten sogar meine Grafiker die gleiche Meinung, dass 8 Bit Farbtiefe unzeitgemäß ist, bis hin zur Behauptung, neuestes Photoshop kann 8 Bit Farbtiefe nicht mehr herstellen.
Alles Quatsch, meiner Meinung nach.
Und um der ganzen Diskussion (und ich will hier auch nicht mehr länger über den Sinn und Unsinn von 8 Bit Bitmaps oder den Sinn und Unsinn von SAP Smartforms debattieren) ein Ende zu bereiten, habe ich gedacht, ich schreibe mal schnell eine Konvertierungsroutine in Freepascal nur um Bitmaps mit mehr als 8 Bit Farbtiefe zu 8 Bit Farbtiefe umzuwandeln.

So, das wär's zum Thema "Was ist das Ziel?"

Benutzeravatar
Winni
Beiträge: 1423
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: Kommandozeilenprogramm zur Reduzierung der Farbtiefe bei Windows-Bitmaps

Beitrag von Winni »

Hi!

Keine Ahnung betr. PhotoShop, aber der Gimp kann RGB(A) Bitmaps in Indexed wandeln und speichern.

Aber wenn Du nur die Bitmap als Datei brauchst, dann hilft Dir dieser Schnipsel weiter: BGRAbitmap kann indizierte 8Bit speichern:

Code: Alles auswählen

    uses BGRABitmap, BGRAWritePNG;
    var writer: TBGRAWriterPNG;
    begin
      writer := TBGRAWriterPNG.Create;
      writer.Indexed := true;
      bmp.SaveToFileUTF8('4up_LowRes8bit.png', writer);
      writer.Free;
    end;
Der Schnipsel ist recht alt. Ich glaube, inzwischen kann man auch noch am Typ des Dithering fummeln zwischen NearestNeighbor und FloydSteinberg. Es gibt ne Unit BGRAdithering.

Damit sollte das Problem gelöst sein.

Winni

kirchfritz
Beiträge: 128
Registriert: Mo 3. Jan 2011, 13:34
OS, Lazarus, FPC: Win10 (L 2.2.2 FPC 3.2.2)
CPU-Target: 64Bit
Wohnort: Nürnberg

Re: Kommandozeilenprogramm zur Reduzierung der Farbtiefe bei Windows-Bitmaps

Beitrag von kirchfritz »

Hallo Winni,

dein Beispielcode erstellt offensichtlich eine PNG-Datei.
Mein Ziel ist es aber, eine BMP-Datei zu erstellen.

Kannst Du mir das auch zeigen, wie das geht?

Fritz

Benutzeravatar
theo
Beiträge: 9580
Registriert: Mo 11. Sep 2006, 19:01

Re: Kommandozeilenprogramm zur Reduzierung der Farbtiefe bei Windows-Bitmaps

Beitrag von theo »

@kirchfritz
Geht das Beispiel bmpconvert8.zip, welches ich oben angehängt hatte nicht?

Antworten