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
Seite 1 von 2  1 2      
DocZenith

Registriert seit: 8. Feb 2006
27 Beiträge
 
#1

Bitmap in SW umwandeln

  Alt 8. Feb 2006, 11:15
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?
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.768 Beiträge
 
Delphi 10.4 Sydney
 
#2

Re: Bitmap in SW umwandeln

  Alt 8. Feb 2006, 11:19
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.
Angehängte Dateien
Dateityp: zip pcx_776.zip (281,8 KB, 48x aufgerufen)
Klaus
  Mit Zitat antworten Zitat
DocZenith

Registriert seit: 8. Feb 2006
27 Beiträge
 
#3

Re: Bitmap in SW umwandeln

  Alt 8. Feb 2006, 11:27
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?
  Mit Zitat antworten Zitat
Benutzerbild von ibp
ibp

Registriert seit: 31. Mär 2004
Ort: Frankfurt am Main
1.511 Beiträge
 
Delphi 7 Architect
 
#4

Re: Bitmap in SW umwandeln

  Alt 8. Feb 2006, 11:35
erstmal herzlich willkomen bei dp

ich denke du musst dir einen filter basteln, der den graustufenwert entweder schwarz oder weiss darstellt!
  Mit Zitat antworten Zitat
DocZenith

Registriert seit: 8. Feb 2006
27 Beiträge
 
#5

Re: Bitmap in SW umwandeln

  Alt 8. Feb 2006, 11:51
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?
  Mit Zitat antworten Zitat
Benutzerbild von ibp
ibp

Registriert seit: 31. Mär 2004
Ort: Frankfurt am Main
1.511 Beiträge
 
Delphi 7 Architect
 
#6

Re: Bitmap in SW umwandeln

  Alt 8. Feb 2006, 12:04
du gibst den mittelwert vor!
  Mit Zitat antworten Zitat
DocZenith

Registriert seit: 8. Feb 2006
27 Beiträge
 
#7

Re: Bitmap in SW umwandeln

  Alt 11. Feb 2006, 20:07
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;
  Mit Zitat antworten Zitat
DocZenith

Registriert seit: 8. Feb 2006
27 Beiträge
 
#8

Re: Bitmap in SW umwandeln

  Alt 11. Feb 2006, 20:10
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;
  Mit Zitat antworten Zitat
rantanplan99
(Gast)

n/a Beiträge
 
#9

Re: Bitmap in SW umwandeln

  Alt 11. Feb 2006, 21:16
Zitat von DocZenith:
, 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:
{ 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;
Also der Teil ist kompletter schwachsinn. sorry für die Wortwahl.
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:
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);
denke das sollte funktionieren. Ich habe es aber nicht getestet.

rantanplan
  Mit Zitat antworten Zitat
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
Antwort Antwort
Seite 1 von 2  1 2      


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 03:43 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz