![]() |
Bitmap in SW umwandeln
Hi!
Muss ein Projekt für die Schule programmieren, indem Bilder von einer Serveranwendung zur Clientanwendung übers Internet verschickt werden müssen. Dort werden die Bilder dann mit einem Sollbild verglichen. Wegen der Internetverbindung soll die bildgröße des zu verschickenden bildes so klein wie möglich sein. daher möchte ich das bitmap mit 1 bit farbtiefe als sw umwandeln. weiß aber nicht wie ich das genau realisieren soll. hab es soweit dass das bild von der webcam eingelesen wird und in graustufen umgewandelt wird. nun weiß ich leider nicht weiter. Kann mir jemand helfen bzw. tipps geben? |
Re: Bitmap in SW umwandeln
Liste der Anhänge anzeigen (Anzahl: 1)
Nun, ich denke nicht, daß ein Graustufenbild so viel kleiner als
ein Farbbild ist. Hier werden nur die Farben in Graustufen dargestellt. Eine reine schwart-weiß "Grafik" wäre das pcx Format. Das is quasi ein bmp Bild mit einem bit Farbtiefe, halt schwarz oder weiß. Ob man das Bild der Webcam dann noch erkennen kann, wage ich doch zu bezweifeln. Grüße Klaus Habe Dir mal eine Unit angehängt, vielleicht bringt die Dich ein wenig weiter. |
Re: Bitmap in SW umwandeln
Erst mal danke für die schnelle Antwort!
Es soll ein Füllstand optisch geregelt werden. daher werden regelmäßig bilder aufgenommen und zur clientanwendung geschickt. mit einem 1 bit sw bild kann ich denk ich mal am besten ein vergleich feststellen (durch zählen der schwarzen pixel z.b.) außerdem wird das bild dann am schnellsten verschickt. ich will das bitmap unter 3 kb größe bekommen, damit es nicht so lange dauert bis es übers i-net verschickt wird, da der regelungsprozess nicht unterbrochen werden darf und zeitlich beansprucht wird. also gibt es jetzt ne möglichkeit umzuwandeln? |
Re: Bitmap in SW umwandeln
erstmal herzlich willkomen bei dp :dp:
ich denke du musst dir einen filter basteln, der den graustufenwert entweder schwarz oder weiss darstellt! |
Re: Bitmap in SW umwandeln
das würde heißen, ich errechne die anzahl aller farbwerte des bildes, also jeden farbwert von jedem
Pixel auf addieren und daraus einen mittelwert bilden. mit dem mittelwert dann jedes pixel vergleichen und je nach dem das pixel dann schwarz oder weiß färben?!?. Gibt es bessere oder alternative ideen? |
Re: Bitmap in SW umwandeln
du gibst den mittelwert vor!
|
Re: Bitmap in SW umwandeln
Also hab jetzt eine Prozedure geschrieben, die ein Videobild (Graustufen) aufnimmt,
es in ein 8Bit sw Bild umwandelt. Ich möchte aber das das Bild ein 1Bit sw Bild ist, wobei 1 für weiß und 0 für schwarz steht, da es ja bei 1Bit nur 1 oder 0 geht. Dadurch benötigt das Bild weniger speicher als ein 8 Bit bild. aber wenn die schleife durchläuft, die das bild in 1 Bit runterrechnet, bleibt das bild leider immer schwarz. warum weiß ich leider nicht. Vielleicht findet ihr den fehler. wäre froh wenn mir jemand helfen könnte.
Delphi-Quellcode:
procedure TMainForm.Timer1Timer(Sender: TObject);
var PixelLine: PByteArray; x, y,xzahl,yzahl: integer; Bitmap: TBitmap; schwellwert,bildpunkte: integer; begin { neues Videobild holen und darstellen - Bild ist bereits Graustufen } GrabVideoImage; Bitmap := VideoImage; bildpunkte := 0; { Schwellwert für Bild ermitteln - Mittelwert } for y := 0 to Bitmap.height - 1 do begin yzahl := 1; PixelLine := Bitmap.ScanLine[y]; yzahl := yzahl + y; for x := 0 to Bitmap.width - 1 do begin xzahl := 1; xzahl := xzahl + x; bildpunkte := bildpunkte + pixelline[x]; end; schwellwert := xzahl * yzahl; schwellwert := bildpunkte div schwellwert; end; { Bild nur mit schwarz und weiß darstellen } Bitmap.PixelFormat := pf8Bit; for y := 0 to Bitmap.height - 1 do begin PixelLine := Bitmap.ScanLine[y]; for x := 0 to Bitmap.width - 1 do begin if PixelLine^[x] > schwellwert then begin pixelline^[x] := 255 end else pixelline^[x] := 0; end; end; { Bildformat auf 1 Bit setzen, damit Speicher eingespart wird } aBitmap.PixelFormat := pf1Bit; for y := 0 to Bitmap.height - 1 do begin PixelLine := Bitmap.ScanLine[y]; for x := 0 to Bitmap.width - 1 do begin if PixelLine^[x] = 255 then begin pixelline^[x] := 1 end else pixelline^[x] := 0; end; end; { Meldung ausgeben } OutputMessage('Es wurde ein Bild aufgenommen.'); mainform.Label1.Caption := floattostr(bildpunkte); mainform.Label2.Caption := inttostr(schwellwert); end; |
Re: Bitmap in SW umwandeln
ups, beim quellcode unten hab ich noch einen fehler (abitmap heißt bitmap!)
Delphi-Quellcode:
{ Bildformat auf 1 Bit setzen, damit Speicher eingespart wird }
[b]Bitmap[/b].PixelFormat := pf1Bit; for y := 0 to Bitmap.height - 1 do begin PixelLine := Bitmap.ScanLine[y]; for x := 0 to Bitmap.width - 1 do begin if PixelLine^[x] = 255 then begin pixelline^[x] := 1 end else pixelline^[x] := 0; end; end; |
Re: Bitmap in SW umwandeln
Zitat:
aber "yzahl := 1" im for-block macht keinen sinn, das die ja jedesmal wieder auf "1" gesetzt, und damit ist "yzahl := yzahl + y;" immer gleich "1 + y". selbest gilt für xzahl. irgendwie hab ich auch nicht verstanden wofür du xzahl und yzahl überhaupt benötigsts. Für was du "bildpunkte" verwendest weiss ich auch nicht. das andere ist der "schwellwert" den du in jeder for-schleife von y neu berechnest. ich vermute das soll den mittleren grauwert des Bildes berechnen. so sollte es klappen:
Delphi-Quellcode:
denke das sollte funktionieren. Ich habe es aber nicht getestet.
var
grauwerte: integer; // integer ist eigentlich schlecht weil es bei entsprechender Bildgröße zu einem Overflow kommen kann! [...] { mittleren Grauwert des Bildes berechnen } grauwerte := 0; for y := 0 to Bitmap.height - 1 do begin PixelLine := Bitmap.ScanLine[y]; for x := 0 to Bitmap.width - 1 do begin grauwerte := grauwerte + PixelLine[x]; end; end; schwellwert := grauwerte div (Bitmap.height * Bitmap.width); rantanplan |
Re: Bitmap in SW umwandeln
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. ![]() 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:
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).
with TBitmap.Create do
try LoadFromFile('TEST.BMP'); Monochrome := true; SaveToFile('MONO-TEST.BMP'); finally Free; end; Mfg FAlter Nachtrag:
Delphi-Quellcode:
//Edit: Korrektur
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; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:44 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