![]() |
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 |
Re: 2-Farben Bmp einlesen und im Array speichern
Zitat:
Delphi-Quellcode:
oder mit Scanline.
var
ColorArray: array [0..MaxX, 0.. MaxY] of TColor; ... ColorArray[x, y] := Bitmap.Canvas.Pixels[x, y]; |
Re: 2-Farben Bmp einlesen und im Array speichern
Hallo,
müsste so funktionieren (ist nur so aus dem Kopf geschrieben):
Delphi-Quellcode:
Ich bin mir grad net ganz sicher ob der Zugriff auf Pixels 0 basiert ist oder doch bei 1 anfängt.
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; Ciao Chris |
Re: 2-Farben Bmp einlesen und im Array speichern
Zitat:
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 |
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. |
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. |
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 ![]() |
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:
In der zweiten Prozedur kommt dann ein EFOpenError "System kann Pfad nicht finden"
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; 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 :( |
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:
Ciao Chris
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; |
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:
es funktioniert einwandfrei mit dem einlesen.
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; 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 17:25 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