Thema: Delphi Bitmap in SW umwandeln

Einzelnen Beitrag anzeigen

Benutzerbild von FAlter
FAlter

Registriert seit: 21. Jul 2004
Ort: Ostfildern
1.096 Beiträge
 
FreePascal / Lazarus
 
#10

Re: Bitmap in SW umwandeln

  Alt 11. Feb 2006, 22:38
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.

Delphi-Referenz durchsuchenTBitmap.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
Felix Alter
  Mit Zitat antworten Zitat