AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi 2-Farben Bmp einlesen und im Array speichern
Thema durchsuchen
Ansicht
Themen-Optionen

2-Farben Bmp einlesen und im Array speichern

Ein Thema von tkone · begonnen am 2. Okt 2009 · letzter Beitrag vom 5. Okt 2009
Antwort Antwort
Seite 1 von 2  1 2      
tkone

Registriert seit: 2. Okt 2009
Ort: Sachsen
63 Beiträge
 
Delphi 7 Professional
 
#1

2-Farben Bmp einlesen und im Array speichern

  Alt 2. Okt 2009, 09:34
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
  Mit Zitat antworten Zitat
Benutzerbild von turboPASCAL
turboPASCAL

Registriert seit: 8. Mai 2005
Ort: Sondershausen
4.274 Beiträge
 
Delphi 6 Personal
 
#2

Re: 2-Farben Bmp einlesen und im Array speichern

  Alt 2. Okt 2009, 10:46
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.
Matti
Meine Software-Projekte - Homepage - Grüße vom Rüsselmops -Mops Mopser
  Mit Zitat antworten Zitat
Chris.R

Registriert seit: 8. Sep 2009
Ort: Nürnberg
68 Beiträge
 
Delphi 2010 Professional
 
#3

Re: 2-Farben Bmp einlesen und im Array speichern

  Alt 2. Okt 2009, 10:50
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
  Mit Zitat antworten Zitat
Benutzerbild von Aphton
Aphton

Registriert seit: 31. Mai 2009
1.198 Beiträge
 
Turbo Delphi für Win32
 
#4

Re: 2-Farben Bmp einlesen und im Array speichern

  Alt 2. Okt 2009, 12:24
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
das Erkennen beginnt, wenn der Erkennende vom zu Erkennenden Abstand nimmt
MfG
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.135 Beiträge
 
Delphi 12 Athens
 
#5

Re: 2-Farben Bmp einlesen und im Array speichern

  Alt 2. Okt 2009, 12:35
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
tkone

Registriert seit: 2. Okt 2009
Ort: Sachsen
63 Beiträge
 
Delphi 7 Professional
 
#6

Re: 2-Farben Bmp einlesen und im Array speichern

  Alt 5. Okt 2009, 07:15
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.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.135 Beiträge
 
Delphi 12 Athens
 
#7

Re: 2-Farben Bmp einlesen und im Array speichern

  Alt 5. Okt 2009, 07:34
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
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
tkone

Registriert seit: 2. Okt 2009
Ort: Sachsen
63 Beiträge
 
Delphi 7 Professional
 
#8

Re: 2-Farben Bmp einlesen und im Array speichern

  Alt 5. Okt 2009, 08:55
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
  Mit Zitat antworten Zitat
Chris.R

Registriert seit: 8. Sep 2009
Ort: Nürnberg
68 Beiträge
 
Delphi 2010 Professional
 
#9

Re: 2-Farben Bmp einlesen und im Array speichern

  Alt 5. Okt 2009, 09:04
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
  Mit Zitat antworten Zitat
tkone

Registriert seit: 2. Okt 2009
Ort: Sachsen
63 Beiträge
 
Delphi 7 Professional
 
#10

Re: 2-Farben Bmp einlesen und im Array speichern

  Alt 5. Okt 2009, 09:37
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
  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 15:53 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