Hi,
erstmal zu obiger falscher Äüßerung: Es gibt BMPs mit 1 Bit (2 Farben, meist Schwarz und weiss), 4 Bit, 8 Bit, 24 Bit und 32 Bit (seltener 15 und 16 Bit). Die Dateigröße einer 1Bit-BMP ist unschlagbar niedrig geghenüber Graustugen-JPEG (1% Qualität) oder 4-Bit-Gif (aber nur 2 Farben), und gegenüber der JPEG bei SW-Grafik extrem bessere Qualität (bei Fotos eher schlecht). Gezippt oder gar LZMA kanns nochmal verkleinern, da es immernoch unkomprimiert ist.
TBitmap.PixelFormat (pf1bit..pf32bit)
Für das genannte Problem könnte man auch BMP.Monochrome setzen. Dann wird die BMP 2Frabig mit den Farben schwearz und weiss (bei pf1bit wird sie bei mir meist schwarz-dunkelrot, müsste man noch Palette bearbeiten).
Delphi-Quellcode:
with TBitmap.Create do
try
LoadFromFile('TEST.BMP');
Monochrome := true;
SaveToFile('MONO-TEST.BMP');
finally
Free;
end;
In einigen Fällen ist vorher eine Farbanpassung nützlich, optimalerweise mit Darstellung der Graustufen als Pixelmuster (so wie Schwarzweißdrucker für Graustufen Muster drucken).
Mfg
FAlter
Nachtrag:
Delphi-Quellcode:
procedure Schwarzweiss(Picture: TBitmap);
const
Blau = 1;
Gruen = 2;
Rot = 3;
type
PixArray = array[Blau..Rot] of Byte;
var
h, w, Wert, i: integer;
p: ^PixArray;
begin
Picture.PixelFormat := pf24bit; //Temporär
for h := 0 to Picture.Height - 1 do
begin
p := Picture.ScanLine[h];
for w := 0 to Picture.Width - 1 do
begin
Wert := (p^[Blau] + p^[Gruen] + p^[Rot]) div 3;
if Wert <= 85 then
for i := Blau to Rot do p^[i] := 0
else
if Wert <= 170 then
begin
if (h mod 2) = (w mod 2) then
for i := Blau to Rot do p^[i] := 0
else
for i := Blau to Rot do p^[i] := 255;
end
else
for i := Blau to Rot do p^[i] := 255;
inc(p);
end;
end;
Picture.Monochrome := true;
end;
//Edit: Korrektur