Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Farbige bitmap schwarz weiß machen (https://www.delphipraxis.net/92185-farbige-bitmap-schwarz-weiss-machen.html)

ghost007 15. Mai 2007 21:38


Farbige bitmap schwarz weiß machen
 
Hallo,
ich hab folgendes problem.
Ich will auf ein LCD via Image ein bild zeichnen, welches mit als farbige bitmap vorliegt.
Wenn ich diese bitmap nun direkt sende, erkennt man lediglich die umrisse, der inhalt ist schwarz.
Nun meine frage, wie kann ich die farbige bitmap in eine schwarz/weiß bitmap umwandeln?

MfG - Ghost007

matashen 15. Mai 2007 21:42

Re: Farbige bitmap schwarz weiß machen
 
dafür gibt es die property bitmap.pixelformat:=pf1bit;

Wenn das zu krass ist, kannst du ja mit grauwerten experimentieren. Infos dazu bei dsdt

ghost007 15. Mai 2007 22:01

Re: Farbige bitmap schwarz weiß machen
 
hm, also das mit dem pixelformat is zu krass, weil dann icons, welche keine dunklen randlinien haben, teilweise verscwhinden.
Mit den grausufen jedoch, kann ich zwar auf der form einen erkennbaren effekt erzielen, das LCD merkt jedoch keinen unterschied :(

MfG - Ghost007

ghost007 17. Mai 2007 09:47

Re: Farbige bitmap schwarz weiß machen
 
*PUSH*

chaosben 17. Mai 2007 10:01

Re: Farbige bitmap schwarz weiß machen
 
Hi!

Ich denke du musst die Bilder per Hand in einem Grafikprogramm in SW umwandeln. Per Code wirst du wahrscheinlich nie ein annehmbares Ergebnis erzielen.

Hawkeye219 17. Mai 2007 11:31

Re: Farbige bitmap schwarz weiß machen
 
Hallo,

wenn du die TGIFImage-Komponente von Anders Melander einbindest, kannst du mit Hilfe der Routine ReduceColors die Anzahl der Farben in einer Bitmap mittels Dithering reduzieren:

Delphi-Quellcode:
// uses GIFImage

var
  bmp : TBitmap;
begin
  bmp := ReduceColors(SourceBitmap, rmMonochrome, dmFloydSteinberg, 0, 0);
  TargetBitmap.Draw (0, 0, bmp);
  bmp.Free;
end;
Gruß Hawkeye

ghost007 17. Mai 2007 11:37

Re: Farbige bitmap schwarz weiß machen
 
hey,
danke :) das is doch mal ein passables ergebnis :)

MfG - Ghost007

alzaimar 17. Mai 2007 11:56

Re: Farbige bitmap schwarz weiß machen
 
Eine sehr simple Methode ist, alle RGB-Pixel durch (R+G+B)/3 zu ersetzen. Mir reicht das in den meisten Fällen

ghost007 17. Mai 2007 11:58

Re: Farbige bitmap schwarz weiß machen
 
öhm, wie meinen ? ^^

MfG - Ghost007

P.S.:Kenn mich mit canvas null aus ... :(

inherited 17. Mai 2007 15:10

Re: Farbige bitmap schwarz weiß machen
 
Du nimmst den Color-Wert, extrahierst da die Rot, Grün und Blauanteile raus (Hier im Forum suchenColorToRGB) und setzt die Farbe auf (R+G+B)/3 :D
Damit das schön schnell geht, solltest du Hier im Forum suchenScanline benutzen.

turboPASCAL 17. Mai 2007 15:43

Re: Farbige bitmap schwarz weiß machen
 
Zitat:

und setzt die Farbe auf (R+G+B)/3
Dann hat man aber das Farbbild in ein Graustufenbild umgewandelt und nicht in ein S/W-Bild.

Delphi-Quellcode:
procedure ConvertTo1BitBitmap(Bitmap: TBitmap);
const
  Blau = 1;
  Gruen = 2;
  Rot = 3;
type
  PixArray = array[Blau..Rot] of Byte;
var
  h, w, Wert, i: integer;
  p: ^PixArray;
begin
  Bitmap.PixelFormat := pf24bit; //Temporär für scanline
  for h := 0 to Bitmap.Height - 1 do
  begin
    p := Bitmap.ScanLine[h];
    for w := 0 to Bitmap.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;

  Bitmap.Monochrome := True;
end;
Diese Procedure ist hier irgend wo in der DP zu finden.


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:32 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