Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi 2-Farben Bmp einlesen und im Array speichern (https://www.delphipraxis.net/141094-2-farben-bmp-einlesen-und-im-array-speichern.html)

tkone 2. Okt 2009 09:34


2-Farben Bmp einlesen und im Array speichern
 
Hi. Hab ein paar Delphi Erfahrungen, brauche aber für ein speziellen Fall Hilfe.
Mit Grafikimplementierung, -bearbeitung und -ausgabe kenn ich mich gar nicht aus.

Also hier zu meinem vorhaben:

1.) eine Bmp soll eingelesen werden(liegt in 2 Bit Darstellung vor)
2.) das Muster der Bmp soll in ein Array eingelesen werden (1Pixel = 1Zelle des Arrays)
Zuordnung Pixel weiß --> Zelleninhalt 0 / Pixel schwarz --> Zelleninhalt 1
3.) das Array wird nach einem Algorithmus bearbeitet und umgeschrieben
4.) das Array wird in eine neue Bmp geschrieben

3 und 4 sehe ich nicht als das Problem an. 3. hab ich schon weitestgehend fertig programmiert und 4. kann ich aus dem Programm entnehmen, welches das 2Bit Bmp speichert.
Daher meine Frage:

Wie kann ich ein 2-Farben Bmp in ein Array einlesen?

Danke schonmal für eure Hilfe

turboPASCAL 2. Okt 2009 10:46

Re: 2-Farben Bmp einlesen und im Array speichern
 
Zitat:

Wie kann ich ein 2-Farben Bmp in ein Array einlesen?
Per:
Delphi-Quellcode:
var
  ColorArray: array [0..MaxX, 0.. MaxY] of TColor;
 
...
ColorArray[x, y] := Bitmap.Canvas.Pixels[x, y];
oder mit Scanline.

Chris.R 2. Okt 2009 10:50

Re: 2-Farben Bmp einlesen und im Array speichern
 
Hallo,

müsste so funktionieren (ist nur so aus dem Kopf geschrieben):


Delphi-Quellcode:
type
  TDynArray2D = array of array of Boolean;


procedure LoadArray(const AFileName: string; var AArray: TDynArray2D);
var
  bmp: TBitmap;
  i, j: integer;
begin
  bmp := TBitmap.Create;

  try
    // Bitmap laden
    bmp.LoadFromFile(AFileName);

    // Dynamischen Array dimensionieren
    SetLength(AArray, bmp.Width);
    for i := Low(AArray) to High(AArray) do
      SetLength(AArray[i], bmp.Height);

    // Bitmap in Array speichern
    for i := 0 to bmp.Width - 1 do // oder evtl "1 to bmp.Width"
      for j := 0 to bmp.Height - 1 do // oder evtl "1 to bmp.Height"
        AArray[i, j] := bmp.Canvas.Pixels[i, j] = clBlack;
  finally
    bmp.Free;
  end;
end;
Ich bin mir grad net ganz sicher ob der Zugriff auf Pixels 0 basiert ist oder doch bei 1 anfängt.

Ciao Chris

Aphton 2. Okt 2009 12:24

Re: 2-Farben Bmp einlesen und im Array speichern
 
Zitat:

Zitat von tkone
1.) eine Bmp soll eingelesen werden(liegt in 2 Bit Darstellung vor)
2.) das Muster der Bmp soll in ein Array eingelesen werden (1Pixel = 1Zelle des Arrays)
Zuordnung Pixel weiß --> Zelleninhalt 0 / Pixel schwarz --> Zelleninhalt 1

Nur um es mal klar zu stellen:
1 Bit kann 2 Zustände annehmen -> gesetzt / nicht gesetzt.
2 Bits hingegen 4!
Also wäre das in deinem Fall nur 1 Bit!

MfG

himitsu 2. Okt 2009 12:35

Re: 2-Farben Bmp einlesen und im Array speichern
 
Warum bearbeitst du das Bild nicht direkt im Bitmap?

via .ScanLine hast du Zugriff auf die Rohdaten (1 Byte je 8 Pixel der Zeile)

Meistens ist bei Schwarz-/Weißbildern 1=weiß und 0=schwarz (kann man aber notfalls über eine Farbpalette auch umdrehn.

tkone 5. Okt 2009 07:15

Re: 2-Farben Bmp einlesen und im Array speichern
 
erstmal vielen dank für die antworten. werd mal schauen, ob ich es zeitlich schaffe heute zu testen.
mit dem scanline-befehl kann ich doch nur komplette reihen bearbeiten, oder hab ich den falsch interpretiert? kann man über den Pointer direkte bereiche der bmp angeben?
ich möchte ne abfrage "von zeile x bis zeile y" und da dann zb reihe 3 und 7 ändern.
dann "von zeile y bis zeile z" die reihen 2, 4 und 9 ändern .
usw.

himitsu 5. Okt 2009 07:34

Re: 2-Farben Bmp einlesen und im Array speichern
 
ScanLine liefert einen Zeiger auf eine komplette Zeile
oder genauer gesagt, es liefert einen Zeiger auf den Anfang der Zeile und somit auf das erste Pixel davon.
Dann kann man (je nach Pixelformat) darüber auf die einzelnen Pixel gezielt zugreifen, da diese ja alle wie in einem Array hintereinanderliegen.

Man könnte sich auch nur mit Scanline den Anfang der letzen Zeile besorgen und hätte dann theoretisch sogar alle Zeilen hintereinander, aber Aufgrund einer Speicherausrichtung hängen diese Zeilen nicht direkt aneinander (mit Ausnahmen, wo die Bildbreite und as Pixelforamt so gewählt sind, daß diese der Speicherausrichtung entsprechen).

Scanline + pf1bit bis pf4bit = jeweils X Pixel pro Byte über eine Farbtabelle kodiert
Scanline + pf15bit bis pf32bit = jeweils 2 bis 4 Byte pro Pixel in RGB-Kodierung

schau dir doch einfach mal die Beispiele zu Hier im Forum suchenScanLine hier an :zwinker:

tkone 5. Okt 2009 08:55

Re: 2-Farben Bmp einlesen und im Array speichern
 
hmm irgendwie will das laden der bmp nicht funktionieren.
also so hab ich es bisher geschrieben.
Delphi-Quellcode:
procedure TForm1.Button3Click(Sender: TObject);
begin
openPictureDialog1.Execute;
OpenPictureDialog1.FileName:='';
OpenPictureDialog1.Title:='Hallo';
OpenPictureDialog1.InitialDir:=ExtractFileDir(OpenPictureDialog1.FileName);

AFilename:=ExtractFileDir(OpenPictureDialog1.FileName);

showmessage(AFilename); //zur kontrolle des dateinamens (liefert derzeit '')

end;
Delphi-Quellcode:
procedure TForm1.Button4Click(Sender: TObject);
var
  bmp: TBitmap;
  i, j: integer;
  AArray: TDynArray2D;
begin
  bmp := TBitmap.Create;

  try
    // Bitmap laden
    bmp.LoadFromFile(AFilename);

    // Dynamischen Array dimensionieren
    SetLength(AArray, bmp.Width);
    for i := Low(AArray) to High(AArray) do
      SetLength(AArray[i], bmp.Height);

    // Bitmap in Array speichern
    for i := 0 to bmp.Width - 1 do
      for j := 0 to bmp.Height - 1 do
        AArray[i, j] := bmp.Canvas.Pixels[i, j] = clBlack;
  finally
    bmp.Free;
  end;
end;
In der zweiten Prozedur kommt dann ein EFOpenError "System kann Pfad nicht finden"
Womöglich liegt das an der ersten Prozedur, da dort nach dem OpenPictureDialog kein Pfad in AFilename gespeichert ist.
Ich zerbrech mir irgendwie den Kopf daran :(

Chris.R 5. Okt 2009 09:04

Re: 2-Farben Bmp einlesen und im Array speichern
 
Hallo,

das kann so auch nicht funktionieren. Ich nehm mal an AFileName ist ein Feld des Formulars.

Du hast nach dem Execute den OpenPictureDialog1.FileName wieder auf '' gesetzt und außerdem in AFileName nur das Verzeichnis der Datei gespeichert.

Delphi-Quellcode:
procedure TForm1.Button3Click(Sender: TObject);
begin
  OpenPictureDialog1.FileName:='';
  OpenPictureDialog1.Title:='Hallo';
  OpenPictureDialog1.InitialDir:=ExtractFileDir(OpenPictureDialog1.FileName);

  if openPictureDialog1.Execute then
    AFileName := openPictureDialog1.Execute
  else
    AFileName := '';

  showmessage(AFilename); //zur kontrolle des dateinamens (liefert derzeit '')

end;
Ciao Chris

tkone 5. Okt 2009 09:37

Re: 2-Farben Bmp einlesen und im Array speichern
 
na klar, du hast natürlich recht.
hab es jetzt korrigiert.
die beiden prozeduren(button 3 und 4) sind zusammengefasst und sehen jetzt so aus
Delphi-Quellcode:
procedure TForm1.Button3Click(Sender: TObject);
var
  bmp: TBitmap;
  i, j: integer;
begin
lokal_max:=0;
bmp := TBitmap.Create;
openPictureDialog1.Execute;
AFilename:=OpenPictureDialog1.Filename;

    try
      // Bitmap laden
      bmp.LoadFromFile(AFilename);

      // Bitmap in Array speichern
      for i := 1 to bmp.Width do
        for j := 1 to bmp.Height do
          Muster[i, j] := bmp.Canvas.Pixels[i, j] = clBlack;
    finally
      bmp.Free;
    end;

end;
es funktioniert einwandfrei mit dem einlesen.
hab dafür erstmal das array statisch gemacht. jetzt bau ich das wieder dynamisch ein.
vielen dank für eure tolle hilfe


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:38 Uhr.
Seite 1 von 2  1 2      

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