AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi Bitmap in SW umwandeln
Thema durchsuchen
Ansicht
Themen-Optionen

Bitmap in SW umwandeln

Ein Thema von DocZenith · begonnen am 8. Feb 2006 · letzter Beitrag vom 13. Feb 2006
Antwort Antwort
Benutzerbild von FAlter
FAlter

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

Re: Bitmap in SW umwandeln

  Alt 11. Feb 2006, 21: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
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:29 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